| Index: bfd/doc/linker.texi
|
| diff --git a/bfd/doc/linker.texi b/bfd/doc/linker.texi
|
| deleted file mode 100644
|
| index eae166278b7ee9579c89f93b09176f50dd3325d5..0000000000000000000000000000000000000000
|
| --- a/bfd/doc/linker.texi
|
| +++ /dev/null
|
| @@ -1,432 +0,0 @@
|
| -@section Linker Functions
|
| -@cindex Linker
|
| -The linker uses three special entry points in the BFD target
|
| -vector. It is not necessary to write special routines for
|
| -these entry points when creating a new BFD back end, since
|
| -generic versions are provided. However, writing them can
|
| -speed up linking and make it use significantly less runtime
|
| -memory.
|
| -
|
| -The first routine creates a hash table used by the other
|
| -routines. The second routine adds the symbols from an object
|
| -file to the hash table. The third routine takes all the
|
| -object files and links them together to create the output
|
| -file. These routines are designed so that the linker proper
|
| -does not need to know anything about the symbols in the object
|
| -files that it is linking. The linker merely arranges the
|
| -sections as directed by the linker script and lets BFD handle
|
| -the details of symbols and relocs.
|
| -
|
| -The second routine and third routines are passed a pointer to
|
| -a @code{struct bfd_link_info} structure (defined in
|
| -@code{bfdlink.h}) which holds information relevant to the link,
|
| -including the linker hash table (which was created by the
|
| -first routine) and a set of callback functions to the linker
|
| -proper.
|
| -
|
| -The generic linker routines are in @code{linker.c}, and use the
|
| -header file @code{genlink.h}. As of this writing, the only back
|
| -ends which have implemented versions of these routines are
|
| -a.out (in @code{aoutx.h}) and ECOFF (in @code{ecoff.c}). The a.out
|
| -routines are used as examples throughout this section.
|
| -
|
| -@menu
|
| -* Creating a Linker Hash Table::
|
| -* Adding Symbols to the Hash Table::
|
| -* Performing the Final Link::
|
| -@end menu
|
| -
|
| -@node Creating a Linker Hash Table, Adding Symbols to the Hash Table, Linker Functions, Linker Functions
|
| -@subsection Creating a linker hash table
|
| -@cindex _bfd_link_hash_table_create in target vector
|
| -@cindex target vector (_bfd_link_hash_table_create)
|
| -The linker routines must create a hash table, which must be
|
| -derived from @code{struct bfd_link_hash_table} described in
|
| -@code{bfdlink.c}. @xref{Hash Tables}, for information on how to
|
| -create a derived hash table. This entry point is called using
|
| -the target vector of the linker output file.
|
| -
|
| -The @code{_bfd_link_hash_table_create} entry point must allocate
|
| -and initialize an instance of the desired hash table. If the
|
| -back end does not require any additional information to be
|
| -stored with the entries in the hash table, the entry point may
|
| -simply create a @code{struct bfd_link_hash_table}. Most likely,
|
| -however, some additional information will be needed.
|
| -
|
| -For example, with each entry in the hash table the a.out
|
| -linker keeps the index the symbol has in the final output file
|
| -(this index number is used so that when doing a relocatable
|
| -link the symbol index used in the output file can be quickly
|
| -filled in when copying over a reloc). The a.out linker code
|
| -defines the required structures and functions for a hash table
|
| -derived from @code{struct bfd_link_hash_table}. The a.out linker
|
| -hash table is created by the function
|
| -@code{NAME(aout,link_hash_table_create)}; it simply allocates
|
| -space for the hash table, initializes it, and returns a
|
| -pointer to it.
|
| -
|
| -When writing the linker routines for a new back end, you will
|
| -generally not know exactly which fields will be required until
|
| -you have finished. You should simply create a new hash table
|
| -which defines no additional fields, and then simply add fields
|
| -as they become necessary.
|
| -
|
| -@node Adding Symbols to the Hash Table, Performing the Final Link, Creating a Linker Hash Table, Linker Functions
|
| -@subsection Adding symbols to the hash table
|
| -@cindex _bfd_link_add_symbols in target vector
|
| -@cindex target vector (_bfd_link_add_symbols)
|
| -The linker proper will call the @code{_bfd_link_add_symbols}
|
| -entry point for each object file or archive which is to be
|
| -linked (typically these are the files named on the command
|
| -line, but some may also come from the linker script). The
|
| -entry point is responsible for examining the file. For an
|
| -object file, BFD must add any relevant symbol information to
|
| -the hash table. For an archive, BFD must determine which
|
| -elements of the archive should be used and adding them to the
|
| -link.
|
| -
|
| -The a.out version of this entry point is
|
| -@code{NAME(aout,link_add_symbols)}.
|
| -
|
| -@menu
|
| -* Differing file formats::
|
| -* Adding symbols from an object file::
|
| -* Adding symbols from an archive::
|
| -@end menu
|
| -
|
| -@node Differing file formats, Adding symbols from an object file, Adding Symbols to the Hash Table, Adding Symbols to the Hash Table
|
| -@subsubsection Differing file formats
|
| -Normally all the files involved in a link will be of the same
|
| -format, but it is also possible to link together different
|
| -format object files, and the back end must support that. The
|
| -@code{_bfd_link_add_symbols} entry point is called via the target
|
| -vector of the file to be added. This has an important
|
| -consequence: the function may not assume that the hash table
|
| -is the type created by the corresponding
|
| -@code{_bfd_link_hash_table_create} vector. All the
|
| -@code{_bfd_link_add_symbols} function can assume about the hash
|
| -table is that it is derived from @code{struct
|
| -bfd_link_hash_table}.
|
| -
|
| -Sometimes the @code{_bfd_link_add_symbols} function must store
|
| -some information in the hash table entry to be used by the
|
| -@code{_bfd_final_link} function. In such a case the output bfd
|
| -xvec must be checked to make sure that the hash table was
|
| -created by an object file of the same format.
|
| -
|
| -The @code{_bfd_final_link} routine must be prepared to handle a
|
| -hash entry without any extra information added by the
|
| -@code{_bfd_link_add_symbols} function. A hash entry without
|
| -extra information will also occur when the linker script
|
| -directs the linker to create a symbol. Note that, regardless
|
| -of how a hash table entry is added, all the fields will be
|
| -initialized to some sort of null value by the hash table entry
|
| -initialization function.
|
| -
|
| -See @code{ecoff_link_add_externals} for an example of how to
|
| -check the output bfd before saving information (in this
|
| -case, the ECOFF external symbol debugging information) in a
|
| -hash table entry.
|
| -
|
| -@node Adding symbols from an object file, Adding symbols from an archive, Differing file formats, Adding Symbols to the Hash Table
|
| -@subsubsection Adding symbols from an object file
|
| -When the @code{_bfd_link_add_symbols} routine is passed an object
|
| -file, it must add all externally visible symbols in that
|
| -object file to the hash table. The actual work of adding the
|
| -symbol to the hash table is normally handled by the function
|
| -@code{_bfd_generic_link_add_one_symbol}. The
|
| -@code{_bfd_link_add_symbols} routine is responsible for reading
|
| -all the symbols from the object file and passing the correct
|
| -information to @code{_bfd_generic_link_add_one_symbol}.
|
| -
|
| -The @code{_bfd_link_add_symbols} routine should not use
|
| -@code{bfd_canonicalize_symtab} to read the symbols. The point of
|
| -providing this routine is to avoid the overhead of converting
|
| -the symbols into generic @code{asymbol} structures.
|
| -
|
| -@findex _bfd_generic_link_add_one_symbol
|
| -@code{_bfd_generic_link_add_one_symbol} handles the details of
|
| -combining common symbols, warning about multiple definitions,
|
| -and so forth. It takes arguments which describe the symbol to
|
| -add, notably symbol flags, a section, and an offset. The
|
| -symbol flags include such things as @code{BSF_WEAK} or
|
| -@code{BSF_INDIRECT}. The section is a section in the object
|
| -file, or something like @code{bfd_und_section_ptr} for an undefined
|
| -symbol or @code{bfd_com_section_ptr} for a common symbol.
|
| -
|
| -If the @code{_bfd_final_link} routine is also going to need to
|
| -read the symbol information, the @code{_bfd_link_add_symbols}
|
| -routine should save it somewhere attached to the object file
|
| -BFD. However, the information should only be saved if the
|
| -@code{keep_memory} field of the @code{info} argument is TRUE, so
|
| -that the @code{-no-keep-memory} linker switch is effective.
|
| -
|
| -The a.out function which adds symbols from an object file is
|
| -@code{aout_link_add_object_symbols}, and most of the interesting
|
| -work is in @code{aout_link_add_symbols}. The latter saves
|
| -pointers to the hash tables entries created by
|
| -@code{_bfd_generic_link_add_one_symbol} indexed by symbol number,
|
| -so that the @code{_bfd_final_link} routine does not have to call
|
| -the hash table lookup routine to locate the entry.
|
| -
|
| -@node Adding symbols from an archive, , Adding symbols from an object file, Adding Symbols to the Hash Table
|
| -@subsubsection Adding symbols from an archive
|
| -When the @code{_bfd_link_add_symbols} routine is passed an
|
| -archive, it must look through the symbols defined by the
|
| -archive and decide which elements of the archive should be
|
| -included in the link. For each such element it must call the
|
| -@code{add_archive_element} linker callback, and it must add the
|
| -symbols from the object file to the linker hash table. (The
|
| -callback may in fact indicate that a replacement BFD should be
|
| -used, in which case the symbols from that BFD should be added
|
| -to the linker hash table instead.)
|
| -
|
| -@findex _bfd_generic_link_add_archive_symbols
|
| -In most cases the work of looking through the symbols in the
|
| -archive should be done by the
|
| -@code{_bfd_generic_link_add_archive_symbols} function. This
|
| -function builds a hash table from the archive symbol table and
|
| -looks through the list of undefined symbols to see which
|
| -elements should be included.
|
| -@code{_bfd_generic_link_add_archive_symbols} is passed a function
|
| -to call to make the final decision about adding an archive
|
| -element to the link and to do the actual work of adding the
|
| -symbols to the linker hash table.
|
| -
|
| -The function passed to
|
| -@code{_bfd_generic_link_add_archive_symbols} must read the
|
| -symbols of the archive element and decide whether the archive
|
| -element should be included in the link. If the element is to
|
| -be included, the @code{add_archive_element} linker callback
|
| -routine must be called with the element as an argument, and
|
| -the element's symbols must be added to the linker hash table
|
| -just as though the element had itself been passed to the
|
| -@code{_bfd_link_add_symbols} function. The @code{add_archive_element}
|
| -callback has the option to indicate that it would like to
|
| -replace the element archive with a substitute BFD, in which
|
| -case it is the symbols of that substitute BFD that must be
|
| -added to the linker hash table instead.
|
| -
|
| -When the a.out @code{_bfd_link_add_symbols} function receives an
|
| -archive, it calls @code{_bfd_generic_link_add_archive_symbols}
|
| -passing @code{aout_link_check_archive_element} as the function
|
| -argument. @code{aout_link_check_archive_element} calls
|
| -@code{aout_link_check_ar_symbols}. If the latter decides to add
|
| -the element (an element is only added if it provides a real,
|
| -non-common, definition for a previously undefined or common
|
| -symbol) it calls the @code{add_archive_element} callback and then
|
| -@code{aout_link_check_archive_element} calls
|
| -@code{aout_link_add_symbols} to actually add the symbols to the
|
| -linker hash table - possibly those of a substitute BFD, if the
|
| -@code{add_archive_element} callback avails itself of that option.
|
| -
|
| -The ECOFF back end is unusual in that it does not normally
|
| -call @code{_bfd_generic_link_add_archive_symbols}, because ECOFF
|
| -archives already contain a hash table of symbols. The ECOFF
|
| -back end searches the archive itself to avoid the overhead of
|
| -creating a new hash table.
|
| -
|
| -@node Performing the Final Link, , Adding Symbols to the Hash Table, Linker Functions
|
| -@subsection Performing the final link
|
| -@cindex _bfd_link_final_link in target vector
|
| -@cindex target vector (_bfd_final_link)
|
| -When all the input files have been processed, the linker calls
|
| -the @code{_bfd_final_link} entry point of the output BFD. This
|
| -routine is responsible for producing the final output file,
|
| -which has several aspects. It must relocate the contents of
|
| -the input sections and copy the data into the output sections.
|
| -It must build an output symbol table including any local
|
| -symbols from the input files and the global symbols from the
|
| -hash table. When producing relocatable output, it must
|
| -modify the input relocs and write them into the output file.
|
| -There may also be object format dependent work to be done.
|
| -
|
| -The linker will also call the @code{write_object_contents} entry
|
| -point when the BFD is closed. The two entry points must work
|
| -together in order to produce the correct output file.
|
| -
|
| -The details of how this works are inevitably dependent upon
|
| -the specific object file format. The a.out
|
| -@code{_bfd_final_link} routine is @code{NAME(aout,final_link)}.
|
| -
|
| -@menu
|
| -* Information provided by the linker::
|
| -* Relocating the section contents::
|
| -* Writing the symbol table::
|
| -@end menu
|
| -
|
| -@node Information provided by the linker, Relocating the section contents, Performing the Final Link, Performing the Final Link
|
| -@subsubsection Information provided by the linker
|
| -Before the linker calls the @code{_bfd_final_link} entry point,
|
| -it sets up some data structures for the function to use.
|
| -
|
| -The @code{input_bfds} field of the @code{bfd_link_info} structure
|
| -will point to a list of all the input files included in the
|
| -link. These files are linked through the @code{link_next} field
|
| -of the @code{bfd} structure.
|
| -
|
| -Each section in the output file will have a list of
|
| -@code{link_order} structures attached to the @code{map_head.link_order}
|
| -field (the @code{link_order} structure is defined in
|
| -@code{bfdlink.h}). These structures describe how to create the
|
| -contents of the output section in terms of the contents of
|
| -various input sections, fill constants, and, eventually, other
|
| -types of information. They also describe relocs that must be
|
| -created by the BFD backend, but do not correspond to any input
|
| -file; this is used to support -Ur, which builds constructors
|
| -while generating a relocatable object file.
|
| -
|
| -@node Relocating the section contents, Writing the symbol table, Information provided by the linker, Performing the Final Link
|
| -@subsubsection Relocating the section contents
|
| -The @code{_bfd_final_link} function should look through the
|
| -@code{link_order} structures attached to each section of the
|
| -output file. Each @code{link_order} structure should either be
|
| -handled specially, or it should be passed to the function
|
| -@code{_bfd_default_link_order} which will do the right thing
|
| -(@code{_bfd_default_link_order} is defined in @code{linker.c}).
|
| -
|
| -For efficiency, a @code{link_order} of type
|
| -@code{bfd_indirect_link_order} whose associated section belongs
|
| -to a BFD of the same format as the output BFD must be handled
|
| -specially. This type of @code{link_order} describes part of an
|
| -output section in terms of a section belonging to one of the
|
| -input files. The @code{_bfd_final_link} function should read the
|
| -contents of the section and any associated relocs, apply the
|
| -relocs to the section contents, and write out the modified
|
| -section contents. If performing a relocatable link, the
|
| -relocs themselves must also be modified and written out.
|
| -
|
| -@findex _bfd_relocate_contents
|
| -@findex _bfd_final_link_relocate
|
| -The functions @code{_bfd_relocate_contents} and
|
| -@code{_bfd_final_link_relocate} provide some general support for
|
| -performing the actual relocations, notably overflow checking.
|
| -Their arguments include information about the symbol the
|
| -relocation is against and a @code{reloc_howto_type} argument
|
| -which describes the relocation to perform. These functions
|
| -are defined in @code{reloc.c}.
|
| -
|
| -The a.out function which handles reading, relocating, and
|
| -writing section contents is @code{aout_link_input_section}. The
|
| -actual relocation is done in @code{aout_link_input_section_std}
|
| -and @code{aout_link_input_section_ext}.
|
| -
|
| -@node Writing the symbol table, , Relocating the section contents, Performing the Final Link
|
| -@subsubsection Writing the symbol table
|
| -The @code{_bfd_final_link} function must gather all the symbols
|
| -in the input files and write them out. It must also write out
|
| -all the symbols in the global hash table. This must be
|
| -controlled by the @code{strip} and @code{discard} fields of the
|
| -@code{bfd_link_info} structure.
|
| -
|
| -The local symbols of the input files will not have been
|
| -entered into the linker hash table. The @code{_bfd_final_link}
|
| -routine must consider each input file and include the symbols
|
| -in the output file. It may be convenient to do this when
|
| -looking through the @code{link_order} structures, or it may be
|
| -done by stepping through the @code{input_bfds} list.
|
| -
|
| -The @code{_bfd_final_link} routine must also traverse the global
|
| -hash table to gather all the externally visible symbols. It
|
| -is possible that most of the externally visible symbols may be
|
| -written out when considering the symbols of each input file,
|
| -but it is still necessary to traverse the hash table since the
|
| -linker script may have defined some symbols that are not in
|
| -any of the input files.
|
| -
|
| -The @code{strip} field of the @code{bfd_link_info} structure
|
| -controls which symbols are written out. The possible values
|
| -are listed in @code{bfdlink.h}. If the value is @code{strip_some},
|
| -then the @code{keep_hash} field of the @code{bfd_link_info}
|
| -structure is a hash table of symbols to keep; each symbol
|
| -should be looked up in this hash table, and only symbols which
|
| -are present should be included in the output file.
|
| -
|
| -If the @code{strip} field of the @code{bfd_link_info} structure
|
| -permits local symbols to be written out, the @code{discard} field
|
| -is used to further controls which local symbols are included
|
| -in the output file. If the value is @code{discard_l}, then all
|
| -local symbols which begin with a certain prefix are discarded;
|
| -this is controlled by the @code{bfd_is_local_label_name} entry point.
|
| -
|
| -The a.out backend handles symbols by calling
|
| -@code{aout_link_write_symbols} on each input BFD and then
|
| -traversing the global hash table with the function
|
| -@code{aout_link_write_other_symbol}. It builds a string table
|
| -while writing out the symbols, which is written to the output
|
| -file at the end of @code{NAME(aout,final_link)}.
|
| -
|
| -@findex bfd_link_split_section
|
| -@subsubsection @code{bfd_link_split_section}
|
| -@strong{Synopsis}
|
| -@example
|
| -bfd_boolean bfd_link_split_section (bfd *abfd, asection *sec);
|
| -@end example
|
| -@strong{Description}@*
|
| -Return nonzero if @var{sec} should be split during a
|
| -reloceatable or final link.
|
| -@example
|
| -#define bfd_link_split_section(abfd, sec) \
|
| - BFD_SEND (abfd, _bfd_link_split_section, (abfd, sec))
|
| -
|
| -@end example
|
| -
|
| -@findex bfd_section_already_linked
|
| -@subsubsection @code{bfd_section_already_linked}
|
| -@strong{Synopsis}
|
| -@example
|
| -bfd_boolean bfd_section_already_linked (bfd *abfd,
|
| - asection *sec,
|
| - struct bfd_link_info *info);
|
| -@end example
|
| -@strong{Description}@*
|
| -Check if @var{data} has been already linked during a reloceatable
|
| -or final link. Return TRUE if it has.
|
| -@example
|
| -#define bfd_section_already_linked(abfd, sec, info) \
|
| - BFD_SEND (abfd, _section_already_linked, (abfd, sec, info))
|
| -
|
| -@end example
|
| -
|
| -@findex bfd_generic_define_common_symbol
|
| -@subsubsection @code{bfd_generic_define_common_symbol}
|
| -@strong{Synopsis}
|
| -@example
|
| -bfd_boolean bfd_generic_define_common_symbol
|
| - (bfd *output_bfd, struct bfd_link_info *info,
|
| - struct bfd_link_hash_entry *h);
|
| -@end example
|
| -@strong{Description}@*
|
| -Convert common symbol @var{h} into a defined symbol.
|
| -Return TRUE on success and FALSE on failure.
|
| -@example
|
| -#define bfd_define_common_symbol(output_bfd, info, h) \
|
| - BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h))
|
| -
|
| -@end example
|
| -
|
| -@findex bfd_find_version_for_sym
|
| -@subsubsection @code{bfd_find_version_for_sym }
|
| -@strong{Synopsis}
|
| -@example
|
| -struct bfd_elf_version_tree * bfd_find_version_for_sym
|
| - (struct bfd_elf_version_tree *verdefs,
|
| - const char *sym_name, bfd_boolean *hide);
|
| -@end example
|
| -@strong{Description}@*
|
| -Search an elf version script tree for symbol versioning
|
| -info and export / don't-export status for a given symbol.
|
| -Return non-NULL on success and NULL on failure; also sets
|
| -the output @samp{hide} boolean parameter.
|
| -
|
| -@findex bfd_hide_sym_by_version
|
| -@subsubsection @code{bfd_hide_sym_by_version}
|
| -@strong{Synopsis}
|
| -@example
|
| -bfd_boolean bfd_hide_sym_by_version
|
| - (struct bfd_elf_version_tree *verdefs, const char *sym_name);
|
| -@end example
|
| -@strong{Description}@*
|
| -Search an elf version script tree for symbol versioning
|
| -info for a given symbol. Return TRUE if the symbol is hidden.
|
| -
|
|
|