18.104.22.168 Writing the symbol table
_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
discard fields of the
The local symbols of the input files will not have been
entered into the linker hash table. The
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
link_order structures, or it may be
done by stepping through the
_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.
strip field of the
controls which symbols are written out. The possible values
are listed in
bfdlink.h. If the value is
keep_hash field of the
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.
strip field of the
permits local symbols to be written out, the
is used to further controls which local symbols are included
in the output file. If the value is
discard_l, then all
local symbols which begin with a certain prefix are discarded;
this is controlled by the
bfd_is_local_label_name entry point.
The a.out backend handles symbols by calling
aout_link_write_symbols on each input BFD and then
traversing the global hash table with the function
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
bfd_boolean bfd_link_split_section (bfd *abfd, asection *sec);
Return nonzero if sec should be split during a reloceatable or final link.
#define bfd_link_split_section(abfd, sec) \ BFD_SEND (abfd, _bfd_link_split_section, (abfd, sec))
void bfd_section_already_linked (bfd *abfd, asection *sec, struct bfd_link_info *info);
Check if sec has been already linked during a reloceatable or final link.
#define bfd_section_already_linked(abfd, sec, info) \ BFD_SEND (abfd, _section_already_linked, (abfd, sec, info))
bfd_boolean bfd_generic_define_common_symbol (bfd *output_bfd, struct bfd_link_info *info, struct bfd_link_hash_entry *h);
Convert common symbol h into a defined symbol. Return TRUE on success and FALSE on failure.
#define bfd_define_common_symbol(output_bfd, info, h) \ BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h))
struct bfd_elf_version_tree * bfd_find_version_for_sym (struct bfd_elf_version_tree *verdefs, const char *sym_name, bfd_boolean *hide);
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 hide boolean parameter.