bfd: Writing the symbol table

 
 2.17.3.3 Writing the symbol table
 .................................
 
 The '_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 'strip' and 'discard'
 fields of the 'bfd_link_info' structure.
 
    The local symbols of the input files will not have been entered into
 the linker hash table.  The '_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 'link_order' structures,
 or it may be done by stepping through the 'input_bfds' list.
 
    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.
 
    The 'strip' field of the 'bfd_link_info' structure controls which
 symbols are written out.  The possible values are listed in 'bfdlink.h'.
 If the value is 'strip_some', then the 'keep_hash' field of the
 '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 'strip' field of the 'bfd_link_info' structure permits local
 symbols to be written out, the 'discard' field 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 'NAME(aout,final_link)'.
 
 2.17.3.4 'bfd_link_split_section'
 .................................
 
 *Synopsis*
      bfd_boolean bfd_link_split_section (bfd *abfd, asection *sec);
    *Description*
 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))
 
 
 2.17.3.5 'bfd_section_already_linked'
 .....................................
 
 *Synopsis*
      bfd_boolean bfd_section_already_linked (bfd *abfd,
          asection *sec,
          struct bfd_link_info *info);
    *Description*
 Check if DATA has been already linked during a reloceatable or final
 link.  Return TRUE if it has.
      #define bfd_section_already_linked(abfd, sec, info) \
             BFD_SEND (abfd, _section_already_linked, (abfd, sec, info))
 
 
 2.17.3.6 'bfd_generic_define_common_symbol'
 ...........................................
 
 *Synopsis*
      bfd_boolean bfd_generic_define_common_symbol
         (bfd *output_bfd, struct bfd_link_info *info,
          struct bfd_link_hash_entry *h);
    *Description*
 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))
 
 
 2.17.3.7 '_bfd_generic_link_hide_symbol'
 ........................................
 
 *Synopsis*
      void _bfd_generic_link_hide_symbol
         (bfd *output_bfd, struct bfd_link_info *info,
          struct bfd_link_hash_entry *h);
    *Description*
 Hide symbol H.  This is an internal function.  It should not be called
 from outside the BFD library.
      #define bfd_link_hide_symbol(output_bfd, info, h) \
             BFD_SEND (output_bfd, _bfd_link_hide_symbol, (output_bfd, info, h))
 
 
 2.17.3.8 'bfd_generic_define_start_stop'
 ........................................
 
 *Synopsis*
      struct bfd_link_hash_entry *bfd_generic_define_start_stop
         (struct bfd_link_info *info,
          const char *symbol, asection *sec);
    *Description*
 Define a __start, __stop, .startof.  or .sizeof.  symbol.  Return the
 symbol or NULL if no such undefined symbol exists.
      #define bfd_define_start_stop(output_bfd, info, symbol, sec) \
             BFD_SEND (output_bfd, _bfd_define_start_stop, (info, symbol, sec))
 
 
 2.17.3.9 'bfd_find_version_for_sym'
 ...................................
 
 *Synopsis*
      struct bfd_elf_version_tree * bfd_find_version_for_sym
         (struct bfd_elf_version_tree *verdefs,
          const char *sym_name, bfd_boolean *hide);
    *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 'hide' boolean parameter.
 
 2.17.3.10 'bfd_hide_sym_by_version'
 ...................................
 
 *Synopsis*
      bfd_boolean bfd_hide_sym_by_version
         (struct bfd_elf_version_tree *verdefs, const char *sym_name);
    *Description*
 Search an elf version script tree for symbol versioning info for a given
 symbol.  Return TRUE if the symbol is hidden.
 
 2.17.3.11 'bfd_link_check_relocs'
 .................................
 
 *Synopsis*
      bfd_boolean bfd_link_check_relocs
         (bfd *abfd, struct bfd_link_info *info);
    *Description*
 Checks the relocs in ABFD for validity.  Does not execute the relocs.
 Return TRUE if everything is OK, FALSE otherwise.  This is the external
 entry point to this code.
 
 2.17.3.12 '_bfd_generic_link_check_relocs'
 ..........................................
 
 *Synopsis*
      bfd_boolean _bfd_generic_link_check_relocs
         (bfd *abfd, struct bfd_link_info *info);
    *Description*
 Stub function for targets that do not implement reloc checking.  Return
 TRUE. This is an internal function.  It should not be called from
 outside the BFD library.
 
 2.17.3.13 'bfd_merge_private_bfd_data'
 ......................................
 
 *Synopsis*
      bfd_boolean bfd_merge_private_bfd_data
         (bfd *ibfd, struct bfd_link_info *info);
    *Description*
 Merge private BFD information from the BFD IBFD to the the output file
 BFD when linking.  Return 'TRUE' on success, 'FALSE' on error.  Possible
 error returns are:
 
    * 'bfd_error_no_memory' - Not enough memory exists to create private
      data for OBFD.
      #define bfd_merge_private_bfd_data(ibfd, info) \
             BFD_SEND ((info)->output_bfd, _bfd_merge_private_bfd_data, \
                       (ibfd, info))
 
 2.17.3.14 '_bfd_generic_verify_endian_match'
 ............................................
 
 *Synopsis*
      bfd_boolean _bfd_generic_verify_endian_match
         (bfd *ibfd, struct bfd_link_info *info);
    *Description*
 Can be used from / for bfd_merge_private_bfd_data to check that
 endianness matches between input and output file.  Returns TRUE for a
 match, otherwise returns FALSE and emits an error.