summaryrefslogtreecommitdiff
path: root/ld/ld.info-5
blob: 8869b3668368349fd3af19015bc89937b21ada70 (plain)
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
This is ld.info, produced by makeinfo version 4.3 from ./ld.texinfo.

START-INFO-DIR-ENTRY
* Ld: (ld).                       The GNU linker.
END-INFO-DIR-ENTRY

   This file documents the GNU linker LD version 2.14.

   Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001,
2002, 2003 Free Software Foundation, Inc.


File: ld.info,  Node: WIN32,  Next: Xtensa,  Prev: TI COFF,  Up: Machine Dependent

`ld' and WIN32 (cygwin/mingw)
=============================

   This section describes some of the win32 specific `ld' issues.  See
*Note Command Line Options: Options for detailed decription of the
command line options mentioned here.

_import libraries_
     The standard Windows linker creates and uses so-called import
     libraries, which contains information for linking to dll's.  They
     are regular static archives and are handled as any other static
     archive.  The cygwin and mingw ports of `ld' have specific support
     for creating such libraries provided with the `--out-implib'
     command line option.

_exporting DLL symbols_
     The cygwin/mingw `ld' has several ways to export symbols for dll's.

    _using auto-export functionality_
          By default `ld' exports symbols with the auto-export
          functionality, which is controlled by the following command
          line options:

             * -export-all-symbols   [This is the default]

             * -exclude-symbols

             * -exclude-libs

          If, however, `--export-all-symbols' is not given explicitly
          on the command line, then the default auto-export behavior
          will be _disabled_ if either of the following are true:

             * A DEF file is used.

             * Any symbol in any object file was marked with the
               __declspec(dllexport) attribute.

    _using a DEF file_
          Another way of exporting symbols is using a DEF file.  A DEF
          file is an ASCII file containing definitions of symbols which
          should be exported when a dll is created.  Usually it is
          named `<dll name>.def' and is added as any other object file
          to the linker's command line.  The file's name must end in
          `.def' or `.DEF'.

               gcc -o <output> <objectfiles> <dll name>.def

          Using a DEF file turns off the normal auto-export behavior,
          unless the `--export-all-symbols' option is also used.

          Here is an example of a DEF file for a shared library called
          `xyz.dll':

               LIBRARY "xyz.dll" BASE=0x10000000
               
               EXPORTS
               foo
               bar
               _bar = bar

          This example defines a base address and three symbols.  The
          third symbol is an alias for the second.  For the complete
          format specification see ld/deffilep.y in the binutils
          sources.

          While linking a shared dll, `ld' is able to create a DEF file
          with the `--output-def <file>' command line option.

    _Using decorations_
          Another way of marking symbols for export is to modify the
          source code itself, so that when building the DLL each symbol
          to be exported is declared as:

               __declspec(dllexport) int a_variable
               __declspec(dllexport) void a_function(int with_args)

          All such symbols will be exported from the DLL.  If, however,
          any of the object files in the DLL contain symbols decorated
          in this way, then the normal auto-export behavior is
          disabled, unless the `--export-all-symbols' option is also
          used.

          Note that object files that wish to access these symbols must
          _not_ decorate them with dllexport.  Instead, they should use
          dllimport, instead:

               __declspec(dllimport) int a_variable
               __declspec(dllimport) void a_function(int with_args)

          This complicates the structure of library header files,
          because when included by the library itself the header must
          declare the variables and functions as dllexport, but when
          included by client code the header must declare them as
          dllimport.  There are a number of idioms that are typically
          used to do this; often client code can omit the __declspec()
          declaration completely.  See `--enable-auto-import' and
          `automatic data imports' for more imformation.

_automatic data imports_
     The standard Windows dll format supports data imports from dlls
     only by adding special decorations (dllimport/dllexport), which
     let the compiler produce specific assembler instructions to deal
     with this issue.  This increases the effort necessary to port
     existing Un*x code to these platforms, especially for large c++
     libraries and applications.  The auto-import feature, which was
     initially provided by Paul Sokolovsky, allows one to omit the
     decorations to archieve a behavior that conforms to that on
     POSIX/Un*x platforms. This feature is enabled with the
     `--enable-auto-import' command-line option, although it is enabled
     by default on cygwin/mingw.  The `--enable-auto-import' option
     itself now serves mainly to suppress any warnings that are
     ordinarily emitted when linked objects trigger the feature's use.

     auto-import of variables does not always work flawlessly without
     additional assistance.  Sometimes, you will see this message

     "variable '<var>' can't be auto-imported. Please read the
     documentation for ld's `--enable-auto-import' for details."

     The `--enable-auto-import' documentation explains why this error
     occurs, and several methods that can be used to overcome this
     difficulty.  One of these methods is the _runtime pseudo-relocs_
     feature, described below.

     For complex variables imported from DLLs (such as structs or
     classes), object files typically contain a base address for the
     variable and an offset (_addend_) within the variable-to specify a
     particular field or public member, for instance.  Unfortunately,
     the runtime loader used in win32 environments is incapable of
     fixing these references at runtime without the additional
     information supplied by dllimport/dllexport decorations.  The
     standard auto-import feature described above is unable to resolve
     these references.

     The `--enable-runtime-pseudo-relocs' switch allows these
     references to be resolved without error, while leaving the task of
     adjusting the references themselves (with their non-zero addends)
     to specialized code provided by the runtime environment.  Recent
     versions of the cygwin and mingw environments and compilers
     provide this runtime support; older versions do not.  However, the
     support is only necessary on the developer's platform; the
     compiled result will run without error on an older system.

     `--enable-runtime-pseudo-relocs' is not the default; it must be
     explicitly enabled as needed.

_direct linking to a dll_
     The cygwin/mingw ports of `ld' support the direct linking,
     including data symbols, to a dll without the usage of any import
     libraries.  This is much faster and uses much less memory than
     does the traditional import library method, expecially when
     linking large libraries or applications.  When `ld' creates an
     import lib, each function or variable exported from the dll is
     stored in its own bfd, even though a single bfd could contain many
     exports.  The overhead involved in storing, loading, and
     processing so many bfd's is quite large, and explains the
     tremendous time, memory, and storage needed to link against
     particularly large or complex libraries when using import libs.

     Linking directly to a dll uses no extra command-line switches
     other than `-L' and `-l', because `ld' already searches for a
     number of names to match each library.  All that is needed from
     the developer's perspective is an understanding of this search, in
     order to force ld to select the dll instead of an import library.

     For instance, when ld is called with the argument `-lxxx' it will
     attempt to find, in the first directory of its search path,

          libxxx.dll.a
          xxx.dll.a
          libxxx.a
          cygxxx.dll (*)
          libxxx.dll
          xxx.dll

     before moving on to the next directory in the search path.

     (*) Actually, this is not `cygxxx.dll' but in fact is
     `<prefix>xxx.dll', where `<prefix>' is set by the `ld' option
     `--dll-search-prefix=<prefix>'. In the case of cygwin, the
     standard gcc spec file includes `--dll-search-prefix=cyg', so in
     effect we actually search for `cygxxx.dll'.

     Other win32-based unix environments, such as mingw or pw32, may
     use other `<prefix>'es, although at present only cygwin makes use
     of this feature.  It was originally intended to help avoid name
     conflicts among dll's built for the various win32/un*x
     environments, so that (for example) two versions of a zlib dll
     could coexist on the same machine.

     The generic cygwin/mingw path layout uses a `bin' directory for
     applications and dll's and a `lib' directory for the import
     libraries (using cygwin nomenclature):

          bin/
          	cygxxx.dll
          lib/
          	libxxx.dll.a   (in case of dll's)
          	libxxx.a       (in case of static archive)

     Linking directly to a dll without using the import library can be
     done two ways:

     1. Use the dll directly by adding the `bin' path to the link line
          gcc -Wl,-verbose  -o a.exe -L../bin/ -lxxx

     However, as the dll's often have version numbers appended to their
     names (`cygncurses-5.dll') this will often fail, unless one
     specifies `-L../bin -lncurses-5' to include the version.  Import
     libs are generally not versioned, and do not have this difficulty.

     2. Create a symbolic link from the dll to a file in the `lib'
     directory according to the above mentioned search pattern.  This
     should be used to avoid unwanted changes in the tools needed for
     making the app/dll.

          ln -s bin/cygxxx.dll lib/[cyg|lib|]xxx.dll[.a]

     Then you can link without any make environment changes.

          gcc -Wl,-verbose  -o a.exe -L../lib/ -lxxx

     This technique also avoids the version number problems, because
     the following is perfectly legal

          bin/
          	cygxxx-5.dll
          lib/
          	libxxx.dll.a -> ../bin/cygxxx-5.dll

     Linking directly to a dll without using an import lib will work
     even when auto-import features are exercised, and even when
     `--enable-runtime-pseudo-relocs' is used.

     Given the improvements in speed and memory usage, one might
     justifiably wonder why import libraries are used at all.  There
     are two reasons:

     1. Until recently, the link-directly-to-dll functionality did _not_
     work with auto-imported data.

     2. Sometimes it is necessary to include pure static objects within
     the import library (which otherwise contains only bfd's for
     indirection symbols that point to the exports of a dll).  Again,
     the import lib for the cygwin kernel makes use of this ability,
     and it is not possible to do this without an import lib.

     So, import libs are not going away.  But the ability to replace
     true import libs with a simple symbolic link to (or a copy of) a
     dll, in most cases, is a useful addition to the suite of tools
     binutils makes available to the win32 developer.  Given the
     massive improvements in memory requirements during linking, storage
     requirements, and linking speed, we expect that many developers
     will soon begin to use this feature whenever possible.

_symbol aliasing_

    _adding additional names_
          Sometimes, it is useful to export symbols with additional
          names.  A symbol `foo' will be exported as `foo', but it can
          also be exported as `_foo' by using special directives in the
          DEF file when creating the dll.  This will affect also the
          optional created import library.  Consider the following DEF
          file:

               LIBRARY "xyz.dll" BASE=0x61000000
               
               EXPORTS
               foo
               _foo = foo

          The line `_foo = foo' maps the symbol `foo' to `_foo'.

          Another method for creating a symbol alias is to create it in
          the source code using the "weak" attribute:

               void foo () { /* Do something.  */; }
               void _foo () __attribute__ ((weak, alias ("foo")));

          See the gcc manual for more information about attributes and
          weak symbols.

    _renaming symbols_
          Sometimes it is useful to rename exports.  For instance, the
          cygwin kernel does this regularly.  A symbol `_foo' can be
          exported as `foo' but not as `_foo' by using special
          directives in the DEF file. (This will also affect the import
          library, if it is created).  In the following example:

               LIBRARY "xyz.dll" BASE=0x61000000
               
               EXPORTS
               _foo = foo

          The line `_foo = foo' maps the exported symbol `foo' to
          `_foo'.

     Note: using a DEF file disables the default auto-export behavior,
     unless the `--export-all-symbols' command line option is used.
     If, however, you are trying to rename symbols, then you should list
     _all_ desired exports in the DEF file, including the symbols that
     are not being renamed, and do _not_ use the `--export-all-symbols'
     option.  If you list only the renamed symbols in the DEF file, and
     use `--export-all-symbols' to handle the other symbols, then the
     both the new names _and_ the original names for the the renamed
     symbols will be exported.  In effect, you'd be aliasing those
     symbols, not renaming them, which is probably not what you wanted.


File: ld.info,  Node: Xtensa,  Prev: WIN32,  Up: Machine Dependent

`ld' and Xtensa Processors
==========================

   The default `ld' behavior for Xtensa processors is to interpret
`SECTIONS' commands so that lists of explicitly named sections in a
specification with a wildcard file will be interleaved when necessary to
keep literal pools within the range of PC-relative load offsets.  For
example, with the command:

     SECTIONS
     {
       .text : {
         *(.literal .text)
       }
     }

`ld' may interleave some of the `.literal' and `.text' sections from
different object files to ensure that the literal pools are within the
range of PC-relative load offsets.  A valid interleaving might place
the `.literal' sections from an initial group of files followed by the
`.text' sections of that group of files.  Then, the `.literal' sections
from the rest of the files and the `.text' sections from the rest of
the files would follow.  The non-interleaved order can still be
specified as:

     SECTIONS
     {
       .text : {
         *(.literal) *(.text)
       }
     }

   The Xtensa version of `ld' enables the `--relax' option by default
to attempt to reduce space in the output image by combining literals
with identical values.  It also provides the `--no-relax' option to
disable this optimization.  When enabled, the relaxation algorithm
ensures that a literal will only be merged with another literal when
the new merged literal location is within the offset range of all of
its uses.

   The relaxation mechanism will also attempt to optimize
assembler-generated "longcall" sequences of `L32R'/`CALLXN' when the
target is known to fit into a `CALLN' instruction encoding.  The
current optimization converts the sequence into `NOP'/`CALLN' and
removes the literal referenced by the `L32R' instruction.


File: ld.info,  Node: BFD,  Next: Reporting Bugs,  Prev: Machine Dependent,  Up: Top

BFD
***

   The linker accesses object and archive files using the BFD libraries.
These libraries allow the linker to use the same routines to operate on
object files whatever the object file format.  A different object file
format can be supported simply by creating a new BFD back end and adding
it to the library.  To conserve runtime memory, however, the linker and
associated tools are usually configured to support only a subset of the
object file formats available.  You can use `objdump -i' (*note
objdump: (binutils.info)objdump.) to list all the formats available for
your configuration.

   As with most implementations, BFD is a compromise between several
conflicting requirements. The major factor influencing BFD design was
efficiency: any time used converting between formats is time which
would not have been spent had BFD not been involved. This is partly
offset by abstraction payback; since BFD simplifies applications and
back ends, more time and care may be spent optimizing algorithms for a
greater speed.

   One minor artifact of the BFD solution which you should bear in mind
is the potential for information loss.  There are two places where
useful information can be lost using the BFD mechanism: during
conversion and during output. *Note BFD information loss::.

* Menu:

* BFD outline::                 How it works: an outline of BFD


File: ld.info,  Node: BFD outline,  Up: BFD

How It Works: An Outline of BFD
===============================

   When an object file is opened, BFD subroutines automatically
determine the format of the input object file.  They then build a
descriptor in memory with pointers to routines that will be used to
access elements of the object file's data structures.

   As different information from the object files is required, BFD
reads from different sections of the file and processes them.  For
example, a very common operation for the linker is processing symbol
tables.  Each BFD back end provides a routine for converting between
the object file's representation of symbols and an internal canonical
format. When the linker asks for the symbol table of an object file, it
calls through a memory pointer to the routine from the relevant BFD
back end which reads and converts the table into a canonical form.  The
linker then operates upon the canonical form. When the link is finished
and the linker writes the output file's symbol table, another BFD back
end routine is called to take the newly created symbol table and
convert it into the chosen output format.

* Menu:

* BFD information loss::	Information Loss
* Canonical format::		The BFD	canonical object-file format


File: ld.info,  Node: BFD information loss,  Next: Canonical format,  Up: BFD outline

Information Loss
----------------

   _Information can be lost during output._ The output formats
supported by BFD do not provide identical facilities, and information
which can be described in one form has nowhere to go in another format.
One example of this is alignment information in `b.out'. There is
nowhere in an `a.out' format file to store alignment information on the
contained data, so when a file is linked from `b.out' and an `a.out'
image is produced, alignment information will not propagate to the
output file. (The linker will still use the alignment information
internally, so the link is performed correctly).

   Another example is COFF section names. COFF files may contain an
unlimited number of sections, each one with a textual section name. If
the target of the link is a format which does not have many sections
(e.g., `a.out') or has sections without names (e.g., the Oasys format),
the link cannot be done simply. You can circumvent this problem by
describing the desired input-to-output section mapping with the linker
command language.

   _Information can be lost during canonicalization._ The BFD internal
canonical form of the external formats is not exhaustive; there are
structures in input formats for which there is no direct representation
internally.  This means that the BFD back ends cannot maintain all
possible data richness through the transformation between external to
internal and back to external formats.

   This limitation is only a problem when an application reads one
format and writes another.  Each BFD back end is responsible for
maintaining as much data as possible, and the internal BFD canonical
form has structures which are opaque to the BFD core, and exported only
to the back ends. When a file is read in one format, the canonical form
is generated for BFD and the application. At the same time, the back
end saves away any information which may otherwise be lost. If the data
is then written back in the same format, the back end routine will be
able to use the canonical form provided by the BFD core as well as the
information it prepared earlier.  Since there is a great deal of
commonality between back ends, there is no information lost when
linking or copying big endian COFF to little endian COFF, or `a.out' to
`b.out'.  When a mixture of formats is linked, the information is only
lost from the files whose format differs from the destination.


File: ld.info,  Node: Canonical format,  Prev: BFD information loss,  Up: BFD outline

The BFD canonical object-file format
------------------------------------

   The greatest potential for loss of information occurs when there is
the least overlap between the information provided by the source
format, that stored by the canonical format, and that needed by the
destination format. A brief description of the canonical form may help
you understand which kinds of data you can count on preserving across
conversions.

_files_
     Information stored on a per-file basis includes target machine
     architecture, particular implementation format type, a demand
     pageable bit, and a write protected bit.  Information like Unix
     magic numbers is not stored here--only the magic numbers' meaning,
     so a `ZMAGIC' file would have both the demand pageable bit and the
     write protected text bit set.  The byte order of the target is
     stored on a per-file basis, so that big- and little-endian object
     files may be used with one another.

_sections_
     Each section in the input file contains the name of the section,
     the section's original address in the object file, size and
     alignment information, various flags, and pointers into other BFD
     data structures.

_symbols_
     Each symbol contains a pointer to the information for the object
     file which originally defined it, its name, its value, and various
     flag bits.  When a BFD back end reads in a symbol table, it
     relocates all symbols to make them relative to the base of the
     section where they were defined.  Doing this ensures that each
     symbol points to its containing section.  Each symbol also has a
     varying amount of hidden private data for the BFD back end.  Since
     the symbol points to the original file, the private data format
     for that symbol is accessible.  `ld' can operate on a collection
     of symbols of wildly different formats without problems.

     Normal global and simple local symbols are maintained on output,
     so an output file (no matter its format) will retain symbols
     pointing to functions and to global, static, and common variables.
     Some symbol information is not worth retaining; in `a.out', type
     information is stored in the symbol table as long symbol names.
     This information would be useless to most COFF debuggers; the
     linker has command line switches to allow users to throw it away.

     There is one word of type information within the symbol, so if the
     format supports symbol type information within symbols (for
     example, COFF, IEEE, Oasys) and the type is simple enough to fit
     within one word (nearly everything but aggregates), the
     information will be preserved.

_relocation level_
     Each canonical BFD relocation record contains a pointer to the
     symbol to relocate to, the offset of the data to relocate, the
     section the data is in, and a pointer to a relocation type
     descriptor. Relocation is performed by passing messages through
     the relocation type descriptor and the symbol pointer. Therefore,
     relocations can be performed on output data using a relocation
     method that is only available in one of the input formats. For
     instance, Oasys provides a byte relocation format.  A relocation
     record requesting this relocation type would point indirectly to a
     routine to perform this, so the relocation may be performed on a
     byte being written to a 68k COFF file, even though 68k COFF has no
     such relocation type.

_line numbers_
     Object formats can contain, for debugging purposes, some form of
     mapping between symbols, source line numbers, and addresses in the
     output file.  These addresses have to be relocated along with the
     symbol information.  Each symbol with an associated list of line
     number records points to the first record of the list.  The head
     of a line number list consists of a pointer to the symbol, which
     allows finding out the address of the function whose line number
     is being described. The rest of the list is made up of pairs:
     offsets into the section and line numbers. Any format which can
     simply derive this information can pass it successfully between
     formats (COFF, IEEE and Oasys).


File: ld.info,  Node: Reporting Bugs,  Next: MRI,  Prev: BFD,  Up: Top

Reporting Bugs
**************

   Your bug reports play an essential role in making `ld' reliable.

   Reporting a bug may help you by bringing a solution to your problem,
or it may not.  But in any case the principal function of a bug report
is to help the entire community by making the next version of `ld' work
better.  Bug reports are your contribution to the maintenance of `ld'.

   In order for a bug report to serve its purpose, you must include the
information that enables us to fix the bug.

* Menu:

* Bug Criteria::                Have you found a bug?
* Bug Reporting::               How to report bugs


File: ld.info,  Node: Bug Criteria,  Next: Bug Reporting,  Up: Reporting Bugs

Have You Found a Bug?
=====================

   If you are not sure whether you have found a bug, here are some
guidelines:

   * If the linker gets a fatal signal, for any input whatever, that is
     a `ld' bug.  Reliable linkers never crash.

   * If `ld' produces an error message for valid input, that is a bug.

   * If `ld' does not produce an error message for invalid input, that
     may be a bug.  In the general case, the linker can not verify that
     object files are correct.

   * If you are an experienced user of linkers, your suggestions for
     improvement of `ld' are welcome in any case.


File: ld.info,  Node: Bug Reporting,  Prev: Bug Criteria,  Up: Reporting Bugs

How to Report Bugs
==================

   A number of companies and individuals offer support for GNU
products.  If you obtained `ld' from a support organization, we
recommend you contact that organization first.

   You can find contact information for many support companies and
individuals in the file `etc/SERVICE' in the GNU Emacs distribution.

   Otherwise, send bug reports for `ld' to `bug-binutils@gnu.org'.

   The fundamental principle of reporting bugs usefully is this:
*report all the facts*.  If you are not sure whether to state a fact or
leave it out, state it!

   Often people omit facts because they think they know what causes the
problem and assume that some details do not matter.  Thus, you might
assume that the name of a symbol you use in an example does not matter.
Well, probably it does not, but one cannot be sure.  Perhaps the bug
is a stray memory reference which happens to fetch from the location
where that name is stored in memory; perhaps, if the name were
different, the contents of that location would fool the linker into
doing the right thing despite the bug.  Play it safe and give a
specific, complete example.  That is the easiest thing for you to do,
and the most helpful.

   Keep in mind that the purpose of a bug report is to enable us to fix
the bug if it is new to us.  Therefore, always write your bug reports
on the assumption that the bug has not been reported previously.

   Sometimes people give a few sketchy facts and ask, "Does this ring a
bell?"  This cannot help us fix a bug, so it is basically useless.  We
respond by asking for enough details to enable us to investigate.  You
might as well expedite matters by sending them to begin with.

   To enable us to fix the bug, you should include all these things:

   * The version of `ld'.  `ld' announces it if you start it with the
     `--version' argument.

     Without this, we will not know whether there is any point in
     looking for the bug in the current version of `ld'.

   * Any patches you may have applied to the `ld' source, including any
     patches made to the `BFD' library.

   * The type of machine you are using, and the operating system name
     and version number.

   * What compiler (and its version) was used to compile `ld'--e.g.
     "`gcc-2.7'".

   * The command arguments you gave the linker to link your example and
     observe the bug.  To guarantee you will not omit something
     important, list them all.  A copy of the Makefile (or the output
     from make) is sufficient.

     If we were to try to guess the arguments, we would probably guess
     wrong and then we might not encounter the bug.

   * A complete input file, or set of input files, that will reproduce
     the bug.  It is generally most helpful to send the actual object
     files provided that they are reasonably small.  Say no more than
     10K.  For bigger files you can either make them available by FTP
     or HTTP or else state that you are willing to send the object
     file(s) to whomever requests them.  (Note - your email will be
     going to a mailing list, so we do not want to clog it up with
     large attachments).  But small attachments are best.

     If the source files were assembled using `gas' or compiled using
     `gcc', then it may be OK to send the source files rather than the
     object files.  In this case, be sure to say exactly what version of
     `gas' or `gcc' was used to produce the object files.  Also say how
     `gas' or `gcc' were configured.

   * A description of what behavior you observe that you believe is
     incorrect.  For example, "It gets a fatal signal."

     Of course, if the bug is that `ld' gets a fatal signal, then we
     will certainly notice it.  But if the bug is incorrect output, we
     might not notice unless it is glaringly wrong.  You might as well
     not give us a chance to make a mistake.

     Even if the problem you experience is a fatal signal, you should
     still say so explicitly.  Suppose something strange is going on,
     such as, your copy of `ld' is out of synch, or you have
     encountered a bug in the C library on your system.  (This has
     happened!)  Your copy might crash and ours would not.  If you told
     us to expect a crash, then when ours fails to crash, we would know
     that the bug was not happening for us.  If you had not told us to
     expect a crash, then we would not be able to draw any conclusion
     from our observations.

   * If you wish to suggest changes to the `ld' source, send us context
     diffs, as generated by `diff' with the `-u', `-c', or `-p' option.
     Always send diffs from the old file to the new file.  If you even
     discuss something in the `ld' source, refer to it by context, not
     by line number.

     The line numbers in our development sources will not match those
     in your sources.  Your line numbers would convey no useful
     information to us.

   Here are some things that are not necessary:

   * A description of the envelope of the bug.

     Often people who encounter a bug spend a lot of time investigating
     which changes to the input file will make the bug go away and which
     changes will not affect it.

     This is often time consuming and not very useful, because the way
     we will find the bug is by running a single example under the
     debugger with breakpoints, not by pure deduction from a series of
     examples.  We recommend that you save your time for something else.

     Of course, if you can find a simpler example to report _instead_
     of the original one, that is a convenience for us.  Errors in the
     output will be easier to spot, running under the debugger will take
     less time, and so on.

     However, simplification is not vital; if you do not want to do
     this, report the bug anyway and send us the entire test case you
     used.

   * A patch for the bug.

     A patch for the bug does help us if it is a good one.  But do not
     omit the necessary information, such as the test case, on the
     assumption that a patch is all we need.  We might see problems
     with your patch and decide to fix the problem another way, or we
     might not understand it at all.

     Sometimes with a program as complicated as `ld' it is very hard to
     construct an example that will make the program follow a certain
     path through the code.  If you do not send us the example, we will
     not be able to construct one, so we will not be able to verify
     that the bug is fixed.

     And if we cannot understand what bug you are trying to fix, or why
     your patch should be an improvement, we will not install it.  A
     test case will help us to understand.

   * A guess about what the bug is or what it depends on.

     Such guesses are usually wrong.  Even we cannot guess right about
     such things without first using the debugger to find the facts.


File: ld.info,  Node: MRI,  Next: GNU Free Documentation License,  Prev: Reporting Bugs,  Up: Top

MRI Compatible Script Files
***************************

   To aid users making the transition to GNU `ld' from the MRI linker,
`ld' can use MRI compatible linker scripts as an alternative to the
more general-purpose linker scripting language described in *Note
Scripts::.  MRI compatible linker scripts have a much simpler command
set than the scripting language otherwise used with `ld'.  GNU `ld'
supports the most commonly used MRI linker commands; these commands are
described here.

   In general, MRI scripts aren't of much use with the `a.out' object
file format, since it only has three sections and MRI scripts lack some
features to make use of them.

   You can specify a file containing an MRI-compatible script using the
`-c' command-line option.

   Each command in an MRI-compatible script occupies its own line; each
command line starts with the keyword that identifies the command (though
blank lines are also allowed for punctuation).  If a line of an
MRI-compatible script begins with an unrecognized keyword, `ld' issues
a warning message, but continues processing the script.

   Lines beginning with `*' are comments.

   You can write these commands using all upper-case letters, or all
lower case; for example, `chip' is the same as `CHIP'.  The following
list shows only the upper-case form of each command.

`ABSOLUTE SECNAME'
`ABSOLUTE SECNAME, SECNAME, ... SECNAME'
     Normally, `ld' includes in the output file all sections from all
     the input files.  However, in an MRI-compatible script, you can
     use the `ABSOLUTE' command to restrict the sections that will be
     present in your output program.  If the `ABSOLUTE' command is used
     at all in a script, then only the sections named explicitly in
     `ABSOLUTE' commands will appear in the linker output.  You can
     still use other input sections (whatever you select on the command
     line, or using `LOAD') to resolve addresses in the output file.

`ALIAS OUT-SECNAME, IN-SECNAME'
     Use this command to place the data from input section IN-SECNAME
     in a section called OUT-SECNAME in the linker output file.

     IN-SECNAME may be an integer.

`ALIGN SECNAME = EXPRESSION'
     Align the section called SECNAME to EXPRESSION.  The EXPRESSION
     should be a power of two.

`BASE EXPRESSION'
     Use the value of EXPRESSION as the lowest address (other than
     absolute addresses) in the output file.

`CHIP EXPRESSION'
`CHIP EXPRESSION, EXPRESSION'
     This command does nothing; it is accepted only for compatibility.

`END'
     This command does nothing whatever; it's only accepted for
     compatibility.

`FORMAT OUTPUT-FORMAT'
     Similar to the `OUTPUT_FORMAT' command in the more general linker
     language, but restricted to one of these output formats:

       1. S-records, if OUTPUT-FORMAT is `S'

       2. IEEE, if OUTPUT-FORMAT is `IEEE'

       3. COFF (the `coff-m68k' variant in BFD), if OUTPUT-FORMAT is
          `COFF'

`LIST ANYTHING...'
     Print (to the standard output file) a link map, as produced by the
     `ld' command-line option `-M'.

     The keyword `LIST' may be followed by anything on the same line,
     with no change in its effect.

`LOAD FILENAME'
`LOAD FILENAME, FILENAME, ... FILENAME'
     Include one or more object file FILENAME in the link; this has the
     same effect as specifying FILENAME directly on the `ld' command
     line.

`NAME OUTPUT-NAME'
     OUTPUT-NAME is the name for the program produced by `ld'; the
     MRI-compatible command `NAME' is equivalent to the command-line
     option `-o' or the general script language command `OUTPUT'.

`ORDER SECNAME, SECNAME, ... SECNAME'
`ORDER SECNAME SECNAME SECNAME'
     Normally, `ld' orders the sections in its output file in the order
     in which they first appear in the input files.  In an
     MRI-compatible script, you can override this ordering with the
     `ORDER' command.  The sections you list with `ORDER' will appear
     first in your output file, in the order specified.

`PUBLIC NAME=EXPRESSION'
`PUBLIC NAME,EXPRESSION'
`PUBLIC NAME EXPRESSION'
     Supply a value (EXPRESSION) for external symbol NAME used in the
     linker input files.

`SECT SECNAME, EXPRESSION'
`SECT SECNAME=EXPRESSION'
`SECT SECNAME EXPRESSION'
     You can use any of these three forms of the `SECT' command to
     specify the start address (EXPRESSION) for section SECNAME.  If
     you have more than one `SECT' statement for the same SECNAME, only
     the _first_ sets the start address.