-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhlkev.txt
387 lines (251 loc) · 17.6 KB
/
hlkev.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
HLK evolution
based on
X68k SILK Hi-Speed Linker v3.01 Copyright 1989-94 SALT
━☆ これはなに? ☆━━━━━━━━━━━━━━━━━━━━━━━━━━
SALT氏の作られた高速リンカであるHLK version 3.01(以下 hlk-3.01)を改造
したものです。
hlk-3.01には、.quadを含むオブジェクトを正しくリンクできないなどの不都
合があったので、それらを修正するとともに若干の機能追加を行っています。
HLK evolutionは以下のバージョンのHLKをベースにしています。
X68k SILK Hi-Speed Linker v3.01 Copyright 1989-94 SALT
━☆ 注意 ☆━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
無保証につき各自の責任で使用して下さい。
転載可です。
━☆ hlk-3.01の不具合 ☆━━━━━━━━━━━━━━━━━━━━━━━━
.quadを含むオブジェクトを正しくリンク出来ません。
この症状の原因については、大野博雄氏の*unofficial* patch level3
(以下hlk-3.01p3)を参照して下さい。
$50_xx系のコマンドに対応していません。
オフセット付き外部参照値のバイトサイズ埋め込みコマンドです。仕様に
ついてはkaiseki.txtや大野氏のパッチを参照して下さい。
.xref a
move.b #a+1,d0
などで生成されます。
引数をHUPAIRの規格通りに受け取りません。
HUPAIR対応プログラムは引数がHUPAIRに従っているかどうかに関係なく、
常にHUPAIRのクォーティング規則に従わなければならないのですが、未対応
のプログラムからの引数は違う方法で受け取っていました。さらにその調べ
方も間違っていました。
struprサブルーチンが終了しません。
未使用なので実害はありません。
・以下の不具合はversion 3.01+5以降で対応したものです。
奇数アドレスからワード/ロングワードを出力できない。
そのような場合、偶数バンダリに補正してから出力していたため、期待通
りのコードにならないだけでなく、メモリを破壊していました。
定数の書き込みはバイト単位で行われるので、アセンブラで"illegal
alignment"の警告が出るコードであっても従来から対応しています。ここで
問題となっているのは、リンカが書き込む値を計算しなければならない属性
の値です。
実行開始アドレスが複数指定されていてもエラーにならない。
気づかずに複数のオブジェクトで指定していた場合、作成された実行ファ
イルが期待通りに動かない原因となります。
・以下の不具合はversion 3.01+12以降で対応したものです。
非コモン領域によるコモン領域の上書きがうまくいかないことがある。
ソースを見る限りではうまくいかない筈はないんですが、何故か駄目な時
があります(うまくいく時もある)。一度コモン領域として定義したラベルを
非コモン領域に変更する時に、コモン領域の合計サイズからそのラベルのサ
イズを減算して補正しているのですが、一度も合計サイズに加算していない
のにも関わらず、減算してしまうことがありました。
━☆ 変更点(オブジェクト関係) ☆━━━━━━━━━━━━━━━━━━━━
.quadを含むオブジェクトを正しくリンク出来るようにしました。
大野氏のパッチとは違う方法です。
hlk-3.01はobj_list_{text|data|...}_sizeをそれ自身の
obj_list_align_sizeで補正し、更に{text|data|...}_sizeを
max_align_size で補正しています。
また、hlk-3.01p3では直前までの{text|data|...}_sizeをこれからリンク
するオブジェクトのobj_list_align_sizeで補正し、
obj_list_{text|data|...}_sizeは補正しません。{text|data|...}_sizeの
補正は行います。
しかし、実は{text|data|...}_sizeの補正というのはセクションを跨いで
オブジェクトの開始位置をアライン補正する事が出来ないので、あらかじめ
各セクションの開始位置を補正しているにすぎません。もしセクションを跨
いだ補正が可能ならば{text|data|...}_sizeは一切補正する必要がありませ
ん。
では何故hlk-3.01やhlk-3.01p3は補正しているのかというと、処理の都合
上そうしているだけです。というわけで、この処理を改良することで不要な
補正の撤廃を行いました。
具体的には、最初のオブジェクトのtext、二番目のオブジェクトのtext、
三番目…、最後のオブジェクトのtext、最初のオブジェクトのdata、…とい
う順番で最後のオブジェクトのstackまで目を通し、この順番で各オブジェ
クト毎の各セクションの直前の補正と先頭位置の決定を行うようにしました。
その結果、{text|data|...}_sizeの補正がない分と、bssの先頭のオブジ
ェクトの直前の補正がdataではなくbssに出力される為、hlk-3.01p3よりも
更に小さな実行形式を出力する場合があります。
なお、hlk-3.01p3はobj_list_{text|data|...}_size が0の場合は補正を
行わないのでより小さくなる事がありますが、それでは不完全です。サイズ
が0のセクションでも未使用とは限りません。
==== test1.s ====
.xref label
pea (label,pc)
andi.l #3,(sp)
addq.l #2,sp
.dc $ff4c ;DOS _EXIT2
==== test2.s ====
.quad
label::
=================
この結果は0が返る筈ですが、hlk-3.01p3でリンクすると返値は2になって
しまいます。
前項で挙げた他の不都合も修正してあります。
テキストセクションはnop($4e71)で埋めるようにしました。
アセンブラやhlk-3.01p3と仕様を合わせました。
・以下の変更はversion 3.01+4以降のものです。
セクション末尾の補正データを 0 にしました。
オブジェクト中の各セクションが奇数サイズだった場合は偶数サイズに補
正され、通常は補正で増えたバイトの分は0が書き込まれます。しかし最後
のオブジェクトについては書き込むデータが不定となっていたので、必ず0
を書き込むように修正しました(不定であっても特に不都合はありません)。
・以下の変更はversion 3.01+5以降のものです。
奇数アドレスからワード/ロングワードを出力できるようにしました。
アドレス依存のロングワードデータについては、再配置表の構造上、出力
することは出来ず、エラーになります. オプション-rnを指定している時は
再配置表の制約を受けないので出力できます。
奇数アドレスからワード/ロングワードのデータを書き込むようなコード
の場合は正常に動かない恐れがあるので(特に68000/68010で)、アセンブラ
が"illegal alignment"の警告を出していないか注意していなければなりま
せん。
実行開始アドレスの複数指定をエラーにしました。
・以下の変更はversion 3.01+9以降のものです。
同一定数シンボルの複数定義をエラーにしません。
アセンブル時に-dオプションによってシンボルを外部定義すると、
doscall.macやiocscall.macなど複数のソースファイルから読み込まれる定
数定義がそれぞれのオブジェクトファイルに全て埋め込まれてしまいます。
このような場合、同じ定義がいくつあっても問題ない筈ですが、hlk-3.01で
はエラーになってしまいます。これを、同一名称のシンボルは、同一の値を
持つ定数(abs)であればエラーにしないようにしました。警告も表示しませ
ん。
・以下の不具合はversion 3.01+12以降で対応したものです。
非コモン領域によるコモン領域の上書きをうまくいくようにした。
いろいろ調べたのですが原因が分かりませんでした. しょうがないので、
一度もコモン領域の合計サイズに加算していないラベルは、減算もしないよ
うにしました. これでうまくいってるみたいです。
━☆ 変更点(オプション関係) ☆━━━━━━━━━━━━━━━━━━━━━
環境変数はHLKを参照するようにしました。
SILK及びsilkは参照しません。
オプション-h、-?で使用法を表示するようにしました。
オプション-mを削除しました。
現状では指定されても無視しますが、将来他の機能が割り当てられる可能
性があります。
オプションを続けて指定できるようにしました。
-t -lを-tlというように指定できます。ただし、-eや-dなどの引数を持つ
オプションの後には何も指定できません。
数値の基数指定を柔軟にしました。
数値を引数に取るオプションのうち-d以外は10進数で指定する仕様でした
が、数値の先頭に"0x"または"$"をつけたときは16進数として解釈するよう
にしました。
オプション-dについては常に16進数で解釈されます("0x"、"$"をつけるこ
とはできます)。これは、gccに-z-heapオプションや-z-stackオプションを
指定した際にリンカに対し16進数で数値が渡される仕様となっているため挙
動を変更できないためです。
・以下の変更はversion 3.01+2以降のものです。
オプション-pの仕様を変更しました。
マップファイル名は必ず-pの直後に、間をあけずに指定して下さい。-pの
後に何もなければ省略されているものとし、実行ファイル名の拡張子を
".map"に変更したファイル名で出力します. ファイル名を指定した場合、拡
張子がなければ".map"を補完します(これを抑制する方法は今のところあり
ません)。
例: hlk -p foo (foo.o -> foo.x、foo.map)
例: hlk -apbar foo (foo.o -> foo、bar.map)
・以下の変更はversion 3.01+3以降のものです。
-dを他のオプションの後に記述できるようにしました。
・以下の変更はversion 3.01+12以降のものです。
オプション-l<lib>、-L pathを追加しました.
-lと<lib>は必ず繋げて指定して下さい(繋げないと単なる-lオプションと
して認識されます)。
━☆ 追加オプション ☆━━━━━━━━━━━━━━━━━━━━━━━━━
-an ... 拡張子補完(実行属性付加の自動判定)
-oオプションで拡張子のないファイル名が指定された場合にのみ、拡張子
を補完せずに実行属性を立てます。実行ファイル名が未指定の場合は拡張子
を補完し、実行属性は立てません。
普段は拡張子を使用して実行属性は使用したくないけど、UN*Xなどの拡張
子を特別扱いしないプラットフォームで記述されたMakefileで、
========
foo: foo.c
$(CC) -o $@ $<
========
と書かれているとfoo.xが作成されて何回でもmakeしてしまうのを防ぎたい
場合に指定します。
-b <num> ... 実行形式のベースアドレス設定
あらかじめアドレス<num>にロードした状態で実行形式が作成されます(ち
なみに.x形式なら指定アドレス以外でも実行できます)。
例) hlk -b0x6800 human.o
-g <num> ... ロードモード設定
出力する実行形式の、実行時のメモリブロックの確保方法を指定します。
出力が.r形式の場合はヘッダがないため無視されます。
0 ... 最大ブロック(標準)
1 ... 最小ブロック
2 ... 高位メモリ
-r .... .r形式の出力
-rn ... .r形式の出力(エラー無視)
ヘッダのない.r形式で実行ファイルを出力します。拡張子が省略された場
合は.rになりますが、-oに拡張子が.rのファイル名を指定しても自動的には
設定されないので注意してください。
-rnを指定した場合は変換エラー(再配置テーブルの使用など)を無視して
強制的に作成します。特定のアドレスから実行されるバイナリを作成する場
合は-bによるベースアドレスの指定が役に立つでしょう。
例: hlk -rn -b0xed0100 -o sramprog.bin sramprog.o
・以下の追加はversion 3.01+3以降のものです。
--help ... 使用法の表示
-hと同じです。
--version ... バージョンの表示
hlkのバージョンを表示して終了します。
--verbose ... 詳細表示モードの指定
-vと同じです。
--quiet ... 詳細表示モードの取り消し.
-zと同じです。
-0 ... .ctor/.dtor対応抑制
-1 ... .ctor/.dtor対応
gcc2に付属のg2as/g2lkとは互換性のないものです。別配布で試用の為の
手引を配布しています。
・以下の追加はversion 3.01+12以降のものです。
-l<lib> ... lib<lib>.aをリンクする
gccの-l<lib>オプションと同じ感覚でリンクするライブラリの指定が出来
ます。-lと<lib>は必ず繋げて記述して下さい。
実際にリンクするライブラリのファイル名はlib<lib>.aとなります。ライ
ブラリアン形式アーカイブのlib<lib>.lやXC互換の<lib>lib.aといったファ
イル名には対応していません。
-L <path> ... ライブラリ検索パスの指定
ライブラリがカレントディレクトリに無かった場合に、<path>で指定した
ディレクトリから検索するようにします。-lオプションでは環境変数libに
設定されたディレクトリしか検索できませんでしたが、このオプションでは
任意のディレクトリを指定できます。
・以下の追加はversion 3.01+18以降のものです。
--makemcs ... MACS(.mcs)形式ファイルの作成
MACS(.mcs)形式でファイルを出力します。拡張子が省略された場合は.mcs
になります。-rオプションが自動的に設定されます。
━☆ 変更点(その他) ☆━━━━━━━━━━━━━━━━━━━━━━━━━
・以下の変更はversion 3.01+2以降のものです。
エラー終了時の終了コードを1にしました。
hlk-3.01では-1を返していましたが、1を返すようにしました。
・以下の変更はversion 3.01+3以降のものです。
環境変数SLASHに対応しました。
$SLASH='/'の場合はパス中のバックスラッシュをスラッシュに変換して表
示します。
・以下の変更はversion 3.01+9以降のものです。
ファイルが見つからない場合はエラー終了する。
指定されたオブジェクトファイルやライブラリが見つからなかった場合は
エラー終了します。
・以下の変更はversion 3.01+15以降のものです。
大容量メモリに対応しました。
060turboのハイメモリ上で実行した場合、hlk-3.01では最大でも16MBまで
しか使用しませんが、060turbo.sysで追加されたDOSコールに対応すること
によりそれ以上のメモリを使用するようになりました。
ただしメモリ管理手法の都合により、空きメモリが複数の空間に分断され
ている場合は全てを使わずにメモリ不足でエラー終了することがあります。
━☆ 制限事項 ☆━━━━━━━━━━━━━━━━━━━━━━━━━━━━
as v3.00で出力される以下のオブジェクトコマンドには対応していません。
6a sect.b
9a 00
━☆ 参考文献 ☆━━━━━━━━━━━━━━━━━━━━━━━━━━━━
X68k SILK Hi-Speed Linker v3.01 Copyright 1989-94 SALT
X68k SILK Hi-Speed Linker v3.01 Copyright 1989-94 SALT
*unofficial* patch level 3 1995-97 oo
━☆ 謝辞 ☆━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
原作者のそると氏と、非公式パッチの作者の大野博雄氏に感謝いたします。特
に大野氏のhlk301p3.docは大変参考になりました。
hlk-3.01p3と紛らわしいので、タイトルを変えています。申し訳ありません。
書庫名も"3.01"は抜かしてhlkev*.zipにしました。
━☆ 連絡先 ☆━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TcbnErik / 立花@桑島技研
https://github.com/kg68k/hlk-ev
[EOF]