-
Notifications
You must be signed in to change notification settings - Fork 9
/
vlink.texi
1391 lines (1158 loc) · 52.6 KB
/
vlink.texi
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
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\ifx\pdfminorversion\undefined
\pdfoptionpdfminorversion=3
\else
\pdfminorversion=3
\fi
\input texinfo
@setfilename vlink.texi
@settitle vlink manual
@setchapternewpage odd
@set UPDATED June 2022
@ifinfo
This is the manual for the portable multi-format linker vlink.
Copyright 1997-2022 Frank Wille
@end ifinfo
@titlepage
@title vlink portable multi-format linker
@author Frank Wille
@subtitle @value{UPDATED}
@page
@end titlepage
@paragraphindent 0
@contents
@chapter General
@section Introduction
@command{vlink} is a portable linker which can be configured to support multiple
input and output file formats at once. It even allows to link input files
with a different format in a single run and generate the output file format
of your choice from it.
The linker supports linking with objects, object archives (static libraries)
and shared objects or libraries. It can generate an executable file with or
without additional information for dynamic linking, a shared object, or
a new object suitable for another linker pass.
Empty sections and other unused data are deleted to achieve a size-optimized
output.
@section Legal
vlink is copyright 1995-2022 by Frank Wille.
This archive may be redistributed without modifications and used
for non-commercial purposes.
An exception for commercial usage is granted, provided that the
target OS is AmigaOS/68k. Resulting binaries may be distributed
commercially without further licensing.
In all other cases you need my written consent.
@section Installation
@command{vlink} comes as a stand-alone program, so no further
installation is necessary.
To use @command{vlink} with @command{vbcc}, copy the binary to
@file{vbcc/bin}, following the installation instructions for
@command{vbcc}.
@chapter The Linker
@section Usage
@command{vlink} links the object and archive files given on the command line
into a new object file. The output object file is either an executable
program, a shared object suitable for loading at run-time, or an
object file that can once again be processed by @command{vlink}.
Object files and archives are processed in the order given on the command
line. Unlike other linkers you usually have to specify each library to link
against only once, as @command{vlink} is smart enough to figure out all dependencies.
The file format of an input object file is determined automatically
by the linker. The default output file format is compiled in
(see @option{-v}) and may be changed by @option{-b}. Optionally, the default
library search path can also be compiled in and is visible with
@option{-v} as well.
The number of output file formats included is configurable at compile time.
@section Supported File Formats
The following file formats are supported:
@table @code
@item a.out
Currently supported:
@itemize @minus
@item aoutnull (Default with standard relocs and undefined endianness)
@item aoutbsd68k (NetBSD/68k)
@item aoutbsd68k4k (NetBSD/68k 4K page size)
@item aoutsun010 (SunOS 68010 and AmigaOS/Atari 68000/010)
@item aoutsun020 (SunOS 68020 and AmigaOS/Atari 68020-68060)
@item aoutbsdi386 (NetBSD/i386)
@item aoutpc386
@item aoutmint (Embeds a.out in TOS format for Atari MiNT executables,
supports extra options like the @code{ataritos} format)
@item aoutjaguar (M68k with special, word-swapped RISC relocations)
@end itemize
Small data offset: @code{0x8000} (unused).
Linker symbols:
@code{__GLOBAL_OFFSET_TABLE_}, @code{__PROCEDURE_LINKAGE_TABLE_},
@code{__DYNAMIC}.
@item amigahunk
The AmigaDos hunk format for M68k. Requires AmigaOS 2.04 with
@option{-Rshort}.
No shared objects. Small data offset @code{0x7ffe}. Linker symbols:
@itemize @minus
@item _DATA_BAS_ (PhxAss)
@item _DATA_LEN_ (PhxAss)
@item _BSS_LEN_ (PhxAss)
@item _LinkerDB (all)
@item __BSSBAS (SASC/StormC)
@item __BSSLEN (SASC/StormC)
@item ___ctors (SASC/StormC)
@item ___dtors (SASC/StormC)
@item _RESLEN (SASC)
@item _RESBASE (SASC)
@item _NEWDATAL (SASC)
@item __DATA_BAS (DICE-C)
@item __DATA_LEN (DICE-C)
@item __BSS_LEN (DICE-C)
@item __RESIDENT (DICE-C)
@item ___machtype (GNU-gcc)
@item ___text_size (GNU-gcc)
@item ___data_size (GNU-gcc)
@item ___bss_size (GNU-gcc)
@end itemize
Automatic constructor/destructor function tables:
@code{___ctors} and @code{___dtors} (will be mapped automatically to
@code{__CTOR_LIST__} and @code{__DTOR_LIST__}). Fastcall-ABI
constructors/destructors replace standard ABI ones, when using
identical name and priority.
Referencing @code{_RESLEN} switches the hunk-format output module
into Resident mode, which will append a special relocation table to the
initialized part of the data-bss section and warns about absolute
references from other sections. This mode can be used to create
reentrable, "pure" programs, for use with the AmigaOS @command{resident}
command.
Hunk-format executables can be linked with some retrictions. All sections
will get an auto-generated, unique, name (specifying their type and their
memory flags).
Supports @option{-Rstd} and @option{-Rshort}. The target-specific
@option{-hunkattr} can be used to overwrite the memory flags of an input
section.
This format was called "amigaos" in former @command{vlink} versions.
@item amigaehf
An extension of the AmigaDOS hunk format for the PowerPC,
32-bit, big endian, as introduced by Haage&Partner GmbH for WarpOS. No
executables (they are in @code{amigahunk} format) or shared objects.
The same linker symbols, constructors/destructors as under
@code{amigahunk} are supported. Additionally, @code{@@_name} symbols will
be created on demand (when referenced).
Supports @option{-Rstd}, @option{-Rshort} and the target-specific
@option{-hunkattr}.
@item amsdos
Absolute raw binary output, similar to rawbin2, but with a header
for Amstrad/Schneider CPC computers.
@item applebin
Absolute raw binary output, similar to rawbin1, but with a header
for Apple DOS 3.3 binary files, suitable for Apple II computers.
@item ataricom
Absolute raw binary output, similar to rawbin1, but with a file header
and section headers for Atari 8-bit computers (Atari 400, 600, 800, etc.).
@item ataritos
Atari-ST TOS file format. Executables only at the moment. Symbol table
in extended DRI format. Symbols may be section- or start-based (option
@option{-tos-textbased}). Additionally is supports the target-specific
options: @option{-tos-flags}, @option{-tos-fastload},
@option{-tos-fastram}, @option{-tos-fastalloc}, @option{-tos-private},
@option{-tos-global}, @option{-tos-super}, @option{-tos-readable}.
The internal linker script defines _LinkerDB for small
data and supports @command{vbcc}-style
constructor/destructor tables
in the data section (@code{__CTOR_LIST__} and @code{__DTOR_LIST__}).
@item bbc
Absolute raw binary output, but additionally writes an @file{.inf}-file for
BBC Micro/Master emulators.
@item bbc2
Like bbc, but banked memory will be written to separate files (with a
suitable linker script) and a loader script is generated.
@item cbmprg
Absolute raw binary output, similar to rawbin1, but with a header
for Commodore 8-bit computers (PET, VIC-20, 64, etc.).
@item cbmreu
Writes multiple images files for the REU memory expansion. Only the
first one has a Commodore PRG header.
@item cocoml
Absolute raw binary output, similar to rawbin1, but with segment headers
and a trailer for Tandy Color Computer machine language files.
@item dragonbin
Absolute raw binary output, similar to rawbin1, but with a header for
Dragon DOS binary files, suitable for Dragon 32 and 64 computers.
@item elf32amigaos
Identical to elf32ppcbe, but when doing dynamic linking it requires that
also all references from shared objects are resolved at link time. This
is due to a limitation of the AmigaOS4 dynamic link editor (elf.library).
@item elf32arm
ELF (executable linkable format) for the ARM architecture.
32-bit, little endian. Small data offset: @code{0x1000}. Linker
Symbols: @code{_SDA_BASE_}. Automatic constructor/destructor
function tables will be placed into the sections @code{.ctors}
and @code{.dtors}. Supports @option{-Rstd} and @option{-Radd}.
@item elf32aros
ELF i386 32-bit little endian like @code{elf32i386}, but generates
relocatable object files as executables. This format is
used for the AROS (Amiga Research OS) operating system.
Supports @option{-Rstd} and @option{-Radd}.
@item elf32i386
ELF (executable linkable format) for Intel 386 and better,
32-bit, little endian. No small data. Automatic constructor/destructor
function tables will be placed into the sections
@code{.ctors} and @code{.dtors}.
Supports @option{-Rstd} and @option{-Radd}.
@item elf32jag
ELF (executable linkable format) for Atari Jaguar RISC, 32-bit,
big endian. Small data offset: @code{0}. Linker symbols:
@code{_SDA_BASE_}. Automatic constructor/destructor function
tables will be placed into the sections @code{.ctors} and @code{.dtors}.
Supports @option{-Rstd} and @option{-Radd}.
@item elf32m68k
ELF (executable linkable format) for Motorola M68k, 32-bit,
big endian. Small data offset: @code{0x8000}. Linker symbols:
@code{_SDA_BASE_}. Automatic constructor/destructor function
tables will be placed into the sections @code{.ctors} and @code{.dtors}.
Supports @option{-Rstd} and @option{-Radd}.
@item elf32morphos
Nearly identical to elf32powerup. Only difference is that
@code{.sdata} and @code{.sbss} sections will not be merged as the MorphOS
loader will take care of it. This format is used for MorphOS.
@item elf32powerup
ELF PowerPC 32-bit big endian like @code{elf32ppcbe}, but generates
relocatable object files as executables. This format is
used for the PowerUp kernel. The linker symbol @code{_LinkerDB} is
defined for @command{vbccppc}-compatibility.
Small data offset: @code{0x8000}.
This format was also called @code{elf32amiga} in former @command{vlink}
versions.
@item elf32ppcbe
ELF (executable linkable format) for PowerPC, 32-bit,
big endian. Small data offset: @code{0x8000}. Linker symbols:
@code{_SDA_BASE_} and @code{_SDA2_BASE} (EABI only). Automatic
constructor/destructor function tables will be placed into the
sections @code{.ctors} and @code{.dtors}.
@item elf64x86
ELF (executable linkable format) for the x86_64 architecture.
64-bit, little endian. No small data. Automatic constructor/destructor
function tables will be placed into the sections
@code{.ctors} and @code{.dtors}.
Supports @option{-Rstd} and @option{-Radd}.
@item ihex
Intel Hex format. No symbols. Output format only.
Without a linker script, the raw binary will be relocated to base address 0.
@item jagsrv
Absolute raw binary output, similar to rawbin1, but with a header to make
it load and execute via the Atari Jaguar SkunkBoard or the VirtualJaguar
emulator.
@item o65-02
The o65 binary relocation format for the 6502 family V1.3, as defined by
Andre Fachat. Supports reading and writing object files and executables,
which may be relocatable.
The following target-specific options are supported: @option{-o65-align},
@option{-o65-author}, @option{-o65-bsszero}, @option{-o65-cpu},
@option{-o65-fopts}, @option{-o65-name}, @option{-o65-paged},
@option{-o65-stack}.
@item o65-816
The o65 binary relocation format for 65816 processors V1.3, as defined by
Andre Fachat. Supports reading and writing object files and executables,
which may be relocatable.
The following target-specific options are supported: @option{-o65-align},
@option{-o65-author}, @option{-o65-bsszero},
@option{-o65-fopts}, @option{-o65-name}, @option{-o65-paged},
@option{-o65-stack}.
@item oricmc
Absolute raw binary output, similar to rawbin1, but with a header for
machine code files, suitable for ORIC-1, Atmos, Telestrat and Pravetz
computers.
The following target-specific options are supported: @option{-autox}.
@item os9-6809
OS-9 program modules for the 6809 processor, as defined by Microware
Systems Corporation and the NitrOS-9 project.
Code is always position-independent and reentrant. Relocation tables
for data-text and data-data references are appended at the initialized
data section in the module. These tables have to be processed by the
program's startup code. @command{vbcc}-style constructor/destructor tables
will be created and placed into the data section. By default, the
module name will be the same as the output file name.
No support for symbol tables.
Supports target-specific options: @option{-os9-mem}, @option{-os9-name},
@option{-os9-ns}, @option{-os9-rev}.
@item rawbin1
Absolute raw binary file. The sections and base addresses
have to be specified by a linker script (option @option{-T}). Gaps
between sections are filled with 0-bytes. Without a linker
script, the raw binary will be relocated to base address 0.
When option @option{-q} (keep relocs) has been specified, the linker
will not execute absolute address relocations, but append a relocation
offset table at the end of the file. The width of a word in this
table matches the target's address size and uses the target's endianness.
The first word defines the size of the following table. You may reference
it by using the @code{__end} symbol, which marks the end of the
bss section. It follows a byte-stream for the reloction offsets.
A byte between 1 and 255 represents the distance in bytes
to the next relocation offset (starts at zero).
A 0-byte indicates that the following word contains a distance greater
than 255. Your startup code has to add the program's start address to the
address values in all these locations. Warning: remaining relocations, like
PC-relative, or other absolute relocations not matching the address size,
will still be resolved by the linker! Which may be desired, or not.
@item rawbin2
Similar to rawbin1. The only difference is that a new output file will
be created, for each section which caused a gap larger than 15 bytes to
the previous section. The new file name will get the section's name
appended after a dot.
@item rawseg
Creates a raw binary file for each segment. Segments can be defined in a
@code{PHDR} block of the linker script. It defaults to text and data segments.
The segment names, their base address and length are written into the output
file while the binary files get their segment name appended to the original
file name.
When option @option{-q} (keep relocs) has been specified, then additional files
containing the relocation offsets are created. The first word in each file
defines the number of relocations. The width of all words in this table
matches the target's address size. Note, that only simple address relocations
with the full address size are supported (no halfwords, etc.), which makes
it nearly useless for certain targets, like the 6502 or RISC CPUs.
@item sinclairql
Absolute raw binary output, similar to rawbin1, for the 68008-based
Sinclair QL computer. Prepends a QDOS file header (default, @option{-qhdr}
or an XTcc trailer (@option{-xtcc}). These headers are mostly used
directly by emulators or for file transfer.
The following target-specific options are supported: @option{-qhdr},
@option{-xtcc}, @option{-stack=<n>}.
@item srec19
@itemx srec28
@itemx srec37
Motorola S-Record format. No symbols. Output format only.
Without a linker script, the raw binary will be relocated to base address 0.
@item vobj-le
@itemx vobj-be
VOBJ file format, generated by the @command{vasm} assembler. VOBJ is
a read-only object file format and is designed to support
any little- or big-endian architecture with all their
specific relocations.
@item xfile
Human68k XFile format, as used on Sharp X68000 computers.
Executables only at the moment. Symbol table supports absolute symbols
and relocatable symbols from the text, data and bss segment. The format
has no differentiation between local and global scope.
The internal linker script defines _LinkerDB for small
data and supports @command{vbcc}-style
constructor/destructor tables
in the data section (@code{__CTOR_LIST__} and @code{__DTOR_LIST__}).
@end table
@section Linker Options
Usually options and input file names can be mixed. Order of options may be
important (e.g. when specifying a library with @option{-l} or a search path
with @option{-L}).
The following general options are supported:
@table @option
@item -Bdynamic
Specifies that linking against dynamic libraries can take
place. If a library specifier of the form @option{-lx} appears on
the command line, @command{vlink} searches for a library of the from
@file{libx.so.n.m} (see the @option{-l} option) according to the search
rules in effect. If such a file can not be found a traditional archive
is looked for. This options can appear anywhere on the command line and is
complementary to @option{-Bstatic}.
@item -Bstatic
The counterpart of @option{-Bdynamic}. This option turns off dynamic
linking for all library specifiers until a @option{-Bdynamic} is once
again given. Any explicitly mentioned shared object encountered on the
command line while this option is in effect is flagged as an error.
@item -Bshareable
Instructs the linker to build a shared object from the object
files rather than a normal executable image.
@item -Bsymbolic
This option causes all symbolic references in the output to be
resolved in this link-edit session. The only remaining run-
time relocation requirements are base-relative relocations,
ie. translation with respect to the load address. Failure to
resolve any symbolic reference causes an error to be reported.
@item -Bforcearchive
Force all members of archives to be loaded, whether or not such
members contribute a definition to any plain object files.
Useful for making a shared library from an archive of PIC
objects without having to unpack the archive.
@item -b targetname
Specifies target file format for the output file. See
also "Supported file formats".
@item -baseoff offset
Defines section offset for base-relative relocations. The
default offset is target-dependent (e.g. @code{0x7ffe} for amigaos
and @code{0x8000} for elf32m68k).
@item -C constructor-type
Defines the type of constructor/destructor function names
to scan for. Valid types are:
@table @code
@item gnu
GNU style constructors
@item vbcc
vbcc style constructors: @code{__INIT[_<pri>]_<name> / __EXIT..}
@item vbccelf
vbcc style constructors: @code{_INIT[_<pri>]_<name> / _EXIT..}
@item sasc
SAS/C style constructors: @code{__STI[_<pri>]_<name> / __STD..}
@end table
@item -Crel
Function references in the constructor/destructor tables (see above)
are written as relative offsets to their current table position instead
of absolute pointers. Useful for PC-relative code.
@item -clr-adduscore
No longer add a preceding underscore for the symbols of the
following objects on the command line.
@item -clr-deluscore
No longer delete a preceding underscore for the symbols of the
following objects on the command line.
@item -D linkersymbol[=value]
Define the linker symbol @code{linkersymbol}, so it may be referenced
by linker script expressions and from object code. The optional @code{value}
is assigned to it, which defaults to @code{1}.
@item -d
@itemx -dc
@itemx -dp
Force allocation of common symbols, even when producing relocatable
output (@option{-r} option).
@item -da
Force allocation of address symbols (PowerOpen), even when producing
relocatable output (@option{-r} option).
@item -e entrypoint
Defines the entry point of an executable and may be either
a symbol or an absolute address. The linker will set the
entry point by trying each of the following methods in order,
stopping when the first succeeds:
@enumerate
@item -e option
@item @code{ENTRY()} command in a linker script
@item value of the symbol @code{_start}, if defined
@item start of the first executable code section
@item address 0
@end enumerate
@item -EB
Presets big-endian mode for reading input and writing output.
@item -EL
Presets little-endian mode for reading input and writing output.
@item -export-dynamic
Put all global symbols of the output file into the dynamic symbol table,
making them visible for shared objects loaded on demand (e.g. by
@code{dlopen()}).
@item -f flavour
Adds a library-flavour. All flavours are cumulatively
appended to each library search-path, whenever a library
was specified with @option{-l}.
Example: One search path and two flavours will search in:
@enumerate
@item @file{<lib-path>},
@item @file{<lib-path>/<flavour1>} and
@item @file{<lib-path>/<flavour1>/<flavour2>}
@end enumerate
@item -F filename
A list of object file names is read from the specified file.
Useful, if the number of objects exceeds the length of the command line.
@item -fixunnamed
All unnamed sections will get a default name according to
their section type (@code{.text}, @code{.data} and @code{.bss}).
@item -gc-all
Section garbage collection.
Starting from the executable's entry point, determine all referenced
sections and delete the unreferenced ones.
@item -gc-empty
Delete all empty sections from an executable, which are not referenced
from anywhere in the linked input files.
Note: Before V1.5d vlink tried to do that always, but it didn't work in
any case.
@item -h
Prints a short help text.
@item -interp interpreter-path
Defines the name of the interpreter, which is usually the
dynamic linker for dynamically linked ELF executables.
Defaults to @file{/usr/lib/ld.so.1}.
@item -k
Keeps the original section order as found in the object files from the
command line. Otherwise vlink links all code sections first, then all data
and finally all bss, even when the first object starts with data.
Has no meaning when using a linker script!
@item -L library-search-path
Add path to the list of directories to search for libraries
specified with the @option{-l} option. When a default search path
was compiled in (see @option{-v}), then it is searched last, before
finally looking into the local directory.
@item -l library-specifier
This option specifies a library to be considered for inclusion
in the output. If the @option{-Bdynamic} option is in effect, a shared
library of the form @file{lib<spec>.so.m.n} (where @code{m} is the
major, and @code{n} is the minor version number, respectively) is searched
for first. The library with the highest version found in the
search path is selected. If no shared library is found or
the @option{-Bstatic} option is in effect, an archive of the form
@file{lib<spec>.a} is looked for in the library search path.
For @code{amigaos}/@code{amigaehf} file formats, the libraries are
called @file{<spec>.lib}.
@item -M[file name]
Produce output about the mapping of sections of the input
files and the values assigned to symbols in the output file.
When the optional @code{file name} is missing output goes to stdout.
@item -m
Enable special treatment of feature-mask suffixes in symbol names.
A decimal number after the last '@code{.}' in a symbol name is
stored as a feature-mask for symbol definitions. The masks in references to
the symbol's name (sans suffix) are combined to a common requirement
mask, which is used to find the best symbol to fulfill this requirement.
Any reference to that symbol without a mask specification will disable
that feature for all references. Also, when the requirement is not met
by any masked symbol, then the normal symbol definition is taken.
@item -minalign alignment
Set a minimum alignment (number of bits which have to be zero) for all
imported sections. The specified @code{alignment} value will only take
effect when higher than the section's current alignment. It defaults to 0.
@item -mrel
Automatically merge sections, when there are PC-relative references
between them.
@item -mtype
Merge all sections of the same type (code, data, bss), even when
their names or attributes differ.
@item -mall
Merge all sections into a single output section.
@item -multibase
The default behaviour of @command{vlink} is to merge all sections
which are accessed base-relative. This guarantees a single
small data section, which can be accessed through a base
register.
If this is not desired - maybe you have several base registers and
small data sections - you can disable this behaviour by specifying
@option{-multibase}.
@item -N oldname newname
Rename all input sections named @file{oldname} into @file{newname}.
This setting is valid for all the following input files and libraries on
the command line and can be disabled with @code{-N oldname oldname}.
Multiple @option{-N} options are allowed.
@item -n
No page alignment of sections or segments in the final
executable (@code{NMAGIC}).
@item -nostdlib
Ignore default library search path, if one was compiled in.
@item -nowarn=n
Do not display warning number @code{n}. May occur multiple times.
@item -o filename
Specifies the name of the output file. Defaults to @file{a.out}.
@item -osec
Output each section as an individual file. The file name given with
@option{-o} will be ignored. Only available for some target formats:
rawbin1, rawbin2, amsdos, cbmprg.
@item -osec=basename
Works like @option{-osec}, but each output file name will be preceded
by @file{"basename."}.
@item -P symbol
Protect a symbol from stripping. This doesn't work for all targets!
@item -q
Emit relocations, even for absolute executables.
@item -R format
Sets the relocation table format. Usually there is no need
to change the default format defined by the target (@option{-b} option).
Valid format strings are:
@table @code
@item std
standard format with addends in the code
@item add
addends are stored in the relocation table
@item short
relocation table with short offsets (e.g. 16 bit)
@end table
Note that most targets only support one or two of these formats.
@item -r
Produce relocatable object file, suitable for another linker pass.
@item -rpath library-search-path
Add a directory to the runtime library search path. This is used
when linking an ELF executable with shared objects. All @option{-rpath}
arguments are concatenated and passed to the runtime linker,
which uses them to locate shared objects at runtime.
@item -S
Strip all debugger symbols from the output.
@item -s
Strip all symbols from the output.
@item -sc
Merge all code sections to a single code section (small code).
@item -sd
Merge all data and bss sections to a single data-bss section (small data).
@item -set-adduscore
Start adding a preceding underscore for the symbols of the
following objects on the command line.
@item -set-deluscore
Start deleting a preceding underscore for the symbols of the
following objects on the command line.
@item -shared
Instructs the linker to build a shared object from the object
files rather than a normal executable image.
@item -soname name
Sets the "real name" of a shared object or library. For ELF
this will create the @code{SONAME} tag in the @code{.dynamic}
section.
@item -T script
Specifies a linker script, which defines the mapping of input
sections and their absolute locations in memory.
The command language used is meant to be nearly identical to that
used in GNU linker scripts, although not everything is implemented
and there are a few additional commands. @xref{Linker Scripts}.
@item -Ttext addr
Set the base address of the first section. It can be overridden by
a linker script.
Without a linker script it either sets the start address of the first
section or of any section, depending on the output format.
@item -t
Trace the linker's file accesses.
@item -textbaserel
Allow base-relative access on code sections. Otherwise the
linker will display a warning.
@item -u symbol
Marks symbol as undefined in the first section which was
found on the command line. This might trigger linking of
additional modules from standard libraries.
This is equivalent to the linker script command EXTERN.
@item -V version
Minimum major version of shared object to be linked behind this option.
@item -v
Prints @command{vlink} version string, default library search path
and implemented target file formats.
@item -vicelabels filename
Generates a label address mapping file for the VICE debugger.
@item -w
Suppress all warning messages.
@item -wfail
The return code of vlink will no longer be 0 (success), when there
was a warning. Errors always make the return code a failure.
@item -X
Discard local symbols in the input files that start with the
letters 'L' or 'l', or with a dot.
@item -x
Discard all local symbols in the input files.
@item -y symbol
Trace the manipulations inflicted on symbol.
@item -Z
Do not move trailing zero-bytes in an initialized section into the
uninitialized part of it, when generating executable output files.
Usually the uninitialized part of a section is determined by the
difference between the section's real size and file size (for
those file formats which support it).
@end table
@subsection Target specific options @code{amigahunk}, @code{amigaehf}
@table @option
@item -broken-debug
Try to ignore free-floating debug hunks, which are used in an illegal
way like a section, together with relocations.
@item -hunkattr secname=value
Overwrite the memory attributes of all input sections named @code{secname}
with @code{value}. For example allocate the @code{DATA} section in
Chip-RAM: @code{-hunkattr DATA=2}. Extended memory attributes are supported.
@end table
@subsection Target specific options @code{aoutmint}, @code{ataritos}
@table @option
@item -tos-flags value
Set the 32 bit flags field of the Atari TOS header to @code{value}.
@item -tos-fastload
Sets the fastload bit (0) in the TOS header.
@item -tos-fastram
Sets the fastram bit (1) in the TOS header.
@item -tos-fastalloc
Sets the fastalloc bit (2) in the TOS header.
@item -tos-private
Sets the flags in the TOS header to mark memory space as private.
@item -tos-global
Sets the flags in the TOS header to mark memory space as global (read/write
by any process).
@item -tos-super
Sets the flags in the TOS header to mark memory space as read-writeable by
processes in supervisor mode only.
@item -tos-readable
Sets the flags in the TOS header to mark memory space as read-only for other
processes.
@item -tos-textbased
Writes text-based (offset to program start) DRI symbols to a TOS executable,
like Devpac does. Otherwise symbol offsets are based on the section they are
defined in.
@end table
@subsection Target specific options @code{o65-02}, @code{o65-816}
@table @option
@item -o65-align val
Set minimum alignment for all sections as number of least significant bits
which have to be zero. @code{val} may be 0, 1, 2, 8. Default behaviour is
to use the maximum alignment given by the input sections.
@item -o65-author name
Store the given author name in the output.
@item -o65-bsszero
Set a flag in the header which requests automatic clearing of the
@code{.bss} section.
@item -o65-cpu cpumodel
Defines that the executable uses the instruction set of the given
6502-model @code{cpumodel}.
Known models are: 6502, 65c02, 65sc02, 65ce02, nmos6502, 65816 (in 6502
emulation mode). Option is not available for @code{o65-816}, which is
native 65816.
@item -o65-fopts
Enable informational header options, generated by the linker: file name,
linker name and version, creation date.
@item -o65-name name
Set the "name" header option to @code{name}. Overwrites the real name
which would be written by @option{-o65-fopts}.
@item -o65-paged
Make the output file use paged alignment and simplified paged relocations.
@item -o65-stack val
Store required stack size as @code{val} to the header.
@end table
@subsection Target specific options @code{oricmc}
@table @option
@item -autox
Set the auto-execute flag in the header, so the program starts
automatically after loading.
@end table
@subsection Target specific options @code{os9-6809}
@table @option
@item -os9-mem=val[K]
Defines the size of the stack and the parameter area, which the
linker will add to the permanent storage size in the module header.
The value given in @code{val} is in bytes. You may specify
the value in K-bytes by appending a '@code{k}' character.
The size of the stack and parameter area defaults to 1024 bytes for
OS9/6809.
@item -os9-name=modname
Set the name of the OS-9 module to @code{modname}. Otherwise it defaults
to the name of the output file or may be specified in the code, labeled
by the symbol @code{__modname}.
@item -os9-ns
Declare the OS-9 module as non-shareable and non-reentrant. It resets
the shareable-flag in the module header, which is set otherwise.
@item -os9-rev=val
Set the revision in the OS-9 module header to @code{val}. Must be a value
between 0 and 15. Defaults to zero.
@end table
@subsection Target specific options @code{sinclairql}
@table @option
@item -qhdr
Prepend a QDOS file header (default).
@item -xtcc
Append an XTcc style trailer.
@item -stack=val
Set the stack size required by the program to @code{val}. Affects the
dataspace size calculation. Defaults to 4096.
@end table
@node Linker Scripts
@chapter Linker Scripts
@node Memory
@section Memory Layout
By default sections may be allocated in all available memory. You
can define specific memory regions by using the @code{MEMORY} command.
The syntax is:
@example
MEMORY @{
memblockname (attr) : ORIGIN = org, LENGTH = len
...
@}
@end example
Defines one of more memory regions with start address @code{org} and a
length of @code{len} bytes. The attributes in @code{(attr)} are optional
and will be ignored by vlink, when specified (just for compatibility, at
the moment). The keywords @code{ORIGIN} and @code{LENGTH} may be
abbreviated down to a single character (@code{o=} and @code{l=}).
Once a memory region is defined as @code{memblockname} the output of
sections can be redirected into it by appending @code{>memblockname} at
the end of a section definition.
@section Output Sections
@example
SECTIONS @{
...
@}
@end example
This is the only mandatory block in each linker script and is used to
define the mapping of input sections to output sections, as well as
their location in memory.
Within this block there may be symbol assignments, also for the location
counter (@code{.}), commands and output section definitions.
A symbol assignment looks like
@example
symbol = expression;
@end example
where @code{expression} may contain the usual arithmetic operations,
other symbols and functions (@xref{Functions}). The special symbol
@code{.} (dot) is the location counter and defines the current address
(VMA) in memory where the following sections and data are placed.
An optional symbol assignment looks like
@example
symbol =? expression;
@end example
where the only difference to a normal symbol assignment is, that
@code{symbol} will only be defined with the given expression when it was
not already defined before (in a line above, or on the command line
with option @option{-D}).
All valid linker-script commands are described here: @xref{Commands}.
An output section definition has many optional attributes and looks like
this in its complete form:
@example
secname vma (type) : AT(lma) @{
file/section-patterns and commands
...
@} >region AT>lma-region :phdr =fill
@end example
Mandatory are only @code{secname}, the colon and the curly-braces.
Everything else is optional.
@table @code
@item secname
Name of the output section to create at the address of the current
location counter.
@item vma
When given, defines the section's start address (VMA) as @code{vma}
and also redefines the location counter.
@item (type)
Optional. The only valid @code{type} in vlink is @code{NOLOAD}, which
avoids writing the section's contents into the output file. Usually
this makes sense for uninitialized sections, like BSS.
@item AT(lma)
Optionally sets the load-address (LMA) of the section to @code{lma}.
Useful for initialized data loaded into ROM, which is copied to its
real address in RAM during startup.
@item >region
Optionally redirects this output section into memory region @code{region}
(defined by the @code{MEMORY} command, @xref{Memory}).
Each memory region has its own location counter!
@item AT>lma-region
Optionally load this output section into memory region @code{lma-region}
(defined by the @code{MEMORY} command, @xref{Memory}).
Each memory region has its own location counter!
@item :phdr
Defines that the output section should go into program segment @code{phdr}.
PHDR segments are used in ELF executables and in vlink's @code{rawseg}
output target. Optional. Uses the last @code{phdr} when omitted.