diff options
Diffstat (limited to 'contrib/binutils/bfd/elf-bfd.h')
-rw-r--r-- | contrib/binutils/bfd/elf-bfd.h | 429 |
1 files changed, 311 insertions, 118 deletions
diff --git a/contrib/binutils/bfd/elf-bfd.h b/contrib/binutils/bfd/elf-bfd.h index 110dd696c547..3fba1c228f0a 100644 --- a/contrib/binutils/bfd/elf-bfd.h +++ b/contrib/binutils/bfd/elf-bfd.h @@ -1,6 +1,6 @@ /* BFD back-end data structures for ELF files. Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004 Free Software Foundation, Inc. + 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LIBELF_H_ #define _LIBELF_H_ 1 @@ -104,40 +104,6 @@ struct elf_link_hash_entry not visible outside this DSO. */ long dynindx; - /* String table index in .dynstr if this is a dynamic symbol. */ - unsigned long dynstr_index; - - /* Hash value of the name computed using the ELF hash function. */ - unsigned long elf_hash_value; - - /* If this is a weak defined symbol from a dynamic object, this - field points to a defined symbol with the same value, if there is - one. Otherwise it is NULL. */ - struct elf_link_hash_entry *weakdef; - - /* Version information. */ - union - { - /* This field is used for a symbol which is not defined in a - regular object. It points to the version information read in - from the dynamic object. */ - Elf_Internal_Verdef *verdef; - /* This field is used for a symbol which is defined in a regular - object. It is set up in size_dynamic_sections. It points to - the version information we should write out for this symbol. */ - struct bfd_elf_version_tree *vertree; - } verinfo; - - /* Virtual table entry use information. This array is nominally of size - size/sizeof(target_void_pointer), though we have to be able to assume - and track a size while the symbol is still undefined. It is indexed - via offset/sizeof(target_void_pointer). */ - size_t vtable_entries_size; - bfd_boolean *vtable_entries_used; - - /* Virtual table derivation info. */ - struct elf_link_hash_entry *vtable_parent; - /* If this symbol requires an entry in the global offset table, the processor specific backend uses this field to track usage and final offset. Two schemes are supported: The first assumes that @@ -162,47 +128,89 @@ struct elf_link_hash_entry bfd_size_type size; /* Symbol type (STT_NOTYPE, STT_OBJECT, etc.). */ - char type; + unsigned int type : 8; /* Symbol st_other value, symbol visibility. */ - unsigned char other; + unsigned int other : 8; - /* Some flags; legal values follow. */ - unsigned short elf_link_hash_flags; /* Symbol is referenced by a non-shared object. */ -#define ELF_LINK_HASH_REF_REGULAR 01 + unsigned int ref_regular : 1; /* Symbol is defined by a non-shared object. */ -#define ELF_LINK_HASH_DEF_REGULAR 02 + unsigned int def_regular : 1; /* Symbol is referenced by a shared object. */ -#define ELF_LINK_HASH_REF_DYNAMIC 04 + unsigned int ref_dynamic : 1; /* Symbol is defined by a shared object. */ -#define ELF_LINK_HASH_DEF_DYNAMIC 010 + unsigned int def_dynamic : 1; /* Symbol has a non-weak reference from a non-shared object. */ -#define ELF_LINK_HASH_REF_REGULAR_NONWEAK 020 + unsigned int ref_regular_nonweak : 1; /* Dynamic symbol has been adjustd. */ -#define ELF_LINK_HASH_DYNAMIC_ADJUSTED 040 + unsigned int dynamic_adjusted : 1; /* Symbol needs a copy reloc. */ -#define ELF_LINK_HASH_NEEDS_COPY 0100 + unsigned int needs_copy : 1; /* Symbol needs a procedure linkage table entry. */ -#define ELF_LINK_HASH_NEEDS_PLT 0200 + unsigned int needs_plt : 1; /* Symbol appears in a non-ELF input file. */ -#define ELF_LINK_NON_ELF 0400 + unsigned int non_elf : 1; /* Symbol should be marked as hidden in the version information. */ -#define ELF_LINK_HIDDEN 01000 + unsigned int hidden : 1; /* Symbol was forced to local scope due to a version script file. */ -#define ELF_LINK_FORCED_LOCAL 02000 + unsigned int forced_local : 1; /* Symbol was marked during garbage collection. */ -#define ELF_LINK_HASH_MARK 04000 + unsigned int mark : 1; /* Symbol is referenced by a non-GOT/non-PLT relocation. This is not currently set by all the backends. */ -#define ELF_LINK_NON_GOT_REF 010000 - /* Symbol has a definition in a shared object. */ -#define ELF_LINK_DYNAMIC_DEF 020000 + unsigned int non_got_ref : 1; + /* Symbol has a definition in a shared object. + FIXME: There is no real need for this field if def_dynamic is never + cleared and all places that test def_dynamic also test def_regular. */ + unsigned int dynamic_def : 1; /* Symbol is weak in all shared objects. */ -#define ELF_LINK_DYNAMIC_WEAK 040000 + unsigned int dynamic_weak : 1; /* Symbol is referenced with a relocation where C/C++ pointer equality matters. */ -#define ELF_LINK_POINTER_EQUALITY_NEEDED 0100000 + unsigned int pointer_equality_needed : 1; + + /* String table index in .dynstr if this is a dynamic symbol. */ + unsigned long dynstr_index; + + union + { + /* If this is a weak defined symbol from a dynamic object, this + field points to a defined symbol with the same value, if there is + one. Otherwise it is NULL. */ + struct elf_link_hash_entry *weakdef; + + /* Hash value of the name computed using the ELF hash function. + Used part way through size_dynamic_sections, after we've finished + with weakdefs. */ + unsigned long elf_hash_value; + } u; + + /* Version information. */ + union + { + /* This field is used for a symbol which is not defined in a + regular object. It points to the version information read in + from the dynamic object. */ + Elf_Internal_Verdef *verdef; + /* This field is used for a symbol which is defined in a regular + object. It is set up in size_dynamic_sections. It points to + the version information we should write out for this symbol. */ + struct bfd_elf_version_tree *vertree; + } verinfo; + + struct + { + /* Virtual table entry use information. This array is nominally of size + size/sizeof(target_void_pointer), though we have to be able to assume + and track a size while the symbol is still undefined. It is indexed + via offset/sizeof(target_void_pointer). */ + size_t size; + bfd_boolean *used; + + /* Virtual table derivation info. */ + struct elf_link_hash_entry *parent; + } *vtable; }; /* Will references to this symbol always reference the symbol @@ -218,6 +226,13 @@ struct elf_link_hash_entry #define SYMBOL_CALLS_LOCAL(INFO, H) \ _bfd_elf_symbol_refs_local_p (H, INFO, 1) +/* Common symbols that are turned into definitions don't have the + DEF_REGULAR flag set, so they might appear to be undefined. */ +#define ELF_COMMON_DEF_P(H) \ + (!(H)->def_regular \ + && !(H)->def_dynamic \ + && (H)->root.type == bfd_link_hash_defined) + /* Records local symbols to be emitted in the dynamic symbol table. */ struct elf_link_local_dynamic_entry @@ -254,11 +269,11 @@ struct cie { struct cie_header hdr; unsigned char version; - unsigned char augmentation[20]; - unsigned int code_align; - int data_align; - unsigned int ra_column; - unsigned int augmentation_size; + char augmentation[20]; + bfd_vma code_align; + bfd_signed_vma data_align; + bfd_vma ra_column; + bfd_vma augmentation_size; struct elf_link_hash_entry *personality; unsigned char per_encoding; unsigned char lsda_encoding; @@ -271,18 +286,22 @@ struct cie struct eh_cie_fde { - unsigned int offset; + /* For FDEs, this points to the CIE used. */ + struct eh_cie_fde *cie_inf; unsigned int size; - asection *sec; + unsigned int offset; unsigned int new_offset; unsigned char fde_encoding; unsigned char lsda_encoding; unsigned char lsda_offset; - unsigned char cie : 1; - unsigned char removed : 1; - unsigned char make_relative : 1; - unsigned char make_lsda_relative : 1; - unsigned char per_encoding_relative : 1; + unsigned int cie : 1; + unsigned int removed : 1; + unsigned int add_augmentation_size : 1; + unsigned int add_fde_encoding : 1; + unsigned int make_relative : 1; + unsigned int make_lsda_relative : 1; + unsigned int need_lsda_relative : 1; + unsigned int per_encoding_relative : 1; }; struct eh_frame_sec_info @@ -302,14 +321,15 @@ struct eh_frame_hdr_info { struct cie last_cie; asection *last_cie_sec; + struct eh_cie_fde *last_cie_inf; asection *hdr_sec; - unsigned int last_cie_offset; unsigned int fde_count, array_count; struct eh_frame_array_ent *array; /* TRUE if .eh_frame_hdr should contain the sorted search table. We build it if we successfully read all .eh_frame input sections and recognize them. */ bfd_boolean table; + bfd_boolean offsets_adjusted; }; /* ELF linker hash table. */ @@ -329,13 +349,15 @@ struct elf_link_hash_table /* The value to use when initialising got.refcount/offset and plt.refcount/offset in an elf_link_hash_entry. Set to zero when - the values are refcounts. Set to init_offset in - size_dynamic_sections when the values may be offsets. */ - union gotplt_union init_refcount; + the values are refcounts. Set to init_got_offset/init_plt_offset + in size_dynamic_sections when the values may be offsets. */ + union gotplt_union init_got_refcount; + union gotplt_union init_plt_refcount; /* The value to use for got.refcount/offset and plt.refcount/offset when the values may be offsets. Normally (bfd_vma) -1. */ - union gotplt_union init_offset; + union gotplt_union init_got_offset; + union gotplt_union init_plt_offset; /* The number of symbols found in the link which must be put into the .dynsym section. */ @@ -356,12 +378,15 @@ struct elf_link_hash_table /* The _GLOBAL_OFFSET_TABLE_ symbol. */ struct elf_link_hash_entry *hgot; - /* A pointer to information used to link stabs in sections. */ - void *stab_info; + /* The _PROCEDURE_LINKAGE_TABLE_ symbol. */ + struct elf_link_hash_entry *hplt; /* A pointer to information used to merge SEC_MERGE sections. */ void *merge_info; + /* Used to link stabs in sections. */ + struct stab_info stab_info; + /* Used by eh_frame code when editing .eh_frame. */ struct eh_frame_hdr_info eh_info; @@ -378,6 +403,10 @@ struct elf_link_hash_table /* A linked list of BFD's loaded in the link. */ struct elf_link_loaded_list *loaded; + + /* True if this target has relocatable executables, so needs dynamic + section symbols. */ + bfd_boolean is_relocatable_executable; }; /* Look up an entry in an ELF linker hash table. */ @@ -520,6 +549,12 @@ struct bfd_elf_special_section int attr; }; +enum action_discarded + { + COMPLAIN = 1, + PRETEND = 2 + }; + struct elf_backend_data { /* The architecture for this backend. */ @@ -531,6 +566,14 @@ struct elf_backend_data /* The maximum page size for this backend. */ bfd_vma maxpagesize; + /* The minimum page size for this backend. An input object will not be + considered page aligned unless its sections are correctly aligned for + pages at least this large. May be smaller than maxpagesize. */ + bfd_vma minpagesize; + + /* The BFD flags applied to sections created for dynamic linking. */ + flagword dynamic_sec_flags; + /* A function to translate an ELF RELA relocation to a BFD arelent structure. */ void (*elf_info_to_howto) @@ -572,11 +615,16 @@ struct elf_backend_data bfd_boolean (*elf_backend_symbol_table_processing) (bfd *, elf_symbol_type *, unsigned int); - /* A function to set the type of the info field. Processor-specific + /* A function to set the type of the info field. Processor-specific types should be handled here. */ int (*elf_backend_get_symbol_type) (Elf_Internal_Sym *, int); + /* A function to return the linker hash table entry of a symbol that + might be satisfied by an archive symbol. */ + struct elf_link_hash_entry * (*elf_backend_archive_symbol_lookup) + (bfd *, struct bfd_link_info *, const char *); + /* Return true if local section symbols should have a non-null st_name. NULL implies false. */ bfd_boolean (*elf_backend_name_local_section_symbols) @@ -592,17 +640,22 @@ struct elf_backend_data /* A function to handle unusual section types when creating BFD sections from ELF sections. */ bfd_boolean (*elf_backend_section_from_shdr) - (bfd *, Elf_Internal_Shdr *, const char *); + (bfd *, Elf_Internal_Shdr *, const char *, int); - /* A function to convert machine dependent section header flags to + /* A function to convert machine dependent ELF section header flags to BFD internal section header flags. */ bfd_boolean (*elf_backend_section_flags) - (flagword *, Elf_Internal_Shdr *); + (flagword *, const Elf_Internal_Shdr *); + + /* A function that returns a struct containing ELF section flags and + type for the given BFD section. */ + const struct bfd_elf_special_section * (*get_sec_type_attr) + (bfd *, asection *); /* A function to handle unusual program segment types when creating BFD sections from ELF program segments. */ bfd_boolean (*elf_backend_section_from_phdr) - (bfd *, Elf_Internal_Phdr *, int); + (bfd *, Elf_Internal_Phdr *, int, const char *); /* A function to set up the ELF section header for a BFD section in preparation for writing it out. This is where the flags and type @@ -646,6 +699,11 @@ struct elf_backend_data bfd_boolean (*elf_backend_create_dynamic_sections) (bfd *abfd, struct bfd_link_info *info); + /* When creating a shared library, determine whether to omit the + dynamic symbol for the section. */ + bfd_boolean (*elf_backend_omit_section_dynsym) + (bfd *output_bfd, struct bfd_link_info *info, asection *osec); + /* The CHECK_RELOCS function is called by the add_symbols phase of the ELF backend linker. It is called once for each section with relocs of an object file, just after the symbols for the object @@ -660,6 +718,13 @@ struct elf_backend_data (bfd *abfd, struct bfd_link_info *info, asection *o, const Elf_Internal_Rela *relocs); + /* The CHECK_DIRECTIVES function is called once per input file by + the add_symbols phase of the ELF backend linker. The function + must inspect the bfd and create any additional symbols according + to any custom directives in the bfd. */ + bfd_boolean (*check_directives) + (bfd *abfd, struct bfd_link_info *info); + /* The ADJUST_DYNAMIC_SYMBOL function is called by the ELF backend linker for every symbol which is defined by a dynamic object and referenced by a regular object. This is called after all the @@ -768,6 +833,11 @@ struct elf_backend_data bfd_boolean (*elf_backend_modify_segment_map) (bfd *, struct bfd_link_info *); + /* This function is called during section garbage collection to + mark sections that define global symbols. */ + bfd_boolean (*gc_mark_dynamic_ref) + (struct elf_link_hash_entry *h, void *inf); + /* This function is called during section gc to discover the section a particular relocation refers to. */ asection * (*gc_mark_hook) @@ -808,7 +878,7 @@ struct elf_backend_data newly created and plt/got refcounts and dynamic indices should not be copied. */ void (*elf_backend_copy_indirect_symbol) - (const struct elf_backend_data *, struct elf_link_hash_entry *, + (struct bfd_link_info *, struct elf_link_hash_entry *, struct elf_link_hash_entry *); /* Modify any information related to dynamic linking such that the @@ -816,15 +886,26 @@ struct elf_backend_data void (*elf_backend_hide_symbol) (struct bfd_link_info *, struct elf_link_hash_entry *, bfd_boolean); + /* A function to do additional symbol fixup, called by + _bfd_elf_fix_symbol_flags. */ + bfd_boolean (*elf_backend_fixup_symbol) + (struct bfd_link_info *, struct elf_link_hash_entry *); + /* Merge the backend specific symbol attribute. */ void (*elf_backend_merge_symbol_attribute) (struct elf_link_hash_entry *, const Elf_Internal_Sym *, bfd_boolean, bfd_boolean); + /* Decide whether an undefined symbol is special and can be ignored. + This is the case for OPTIONAL symbols on IRIX. */ + bfd_boolean (*elf_backend_ignore_undef_symbol) + (struct elf_link_hash_entry *); + /* Emit relocations. Overrides default routine for emitting relocs, except during a relocatable link, or if all relocs are being emitted. */ bfd_boolean (*elf_backend_emit_relocs) - (bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *); + (bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *, + struct elf_link_hash_entry **); /* Count relocations. Not called for relocatable links or if all relocs are being preserved in the output. */ @@ -861,6 +942,17 @@ struct elf_backend_data bfd_boolean (*elf_backend_ignore_discarded_relocs) (asection *); + /* What to do when ld finds relocations against symbols defined in + discarded sections. */ + unsigned int (*action_discarded) + (asection *); + + /* This function returns the width of FDE pointers in bytes, or 0 if + that can't be determined for some reason. The default definition + goes by the bfd's EI_CLASS. */ + unsigned int (*elf_backend_eh_frame_address_size) + (bfd *, asection *); + /* These functions tell elf-eh-frame whether to attempt to turn absolute or lsda encodings into pc-relative ones. The default definition enables these transformations. */ @@ -900,7 +992,41 @@ struct elf_backend_data see elf.c, elfcode.h. */ bfd *(*elf_backend_bfd_from_remote_memory) (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, - int (*target_read_memory) (bfd_vma vma, char *myaddr, int len)); + int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr, int len)); + + /* This function is used by `_bfd_elf_get_synthetic_symtab'; + see elf.c. */ + bfd_vma (*plt_sym_val) (bfd_vma, const asection *, const arelent *); + + /* Is symbol defined in common section? */ + bfd_boolean (*common_definition) (Elf_Internal_Sym *); + + /* Return a common section index for section. */ + unsigned int (*common_section_index) (asection *); + + /* Return a common section for section. */ + asection *(*common_section) (asection *); + + /* Return TRUE if we can merge 2 definitions. */ + bfd_boolean (*merge_symbol) (struct bfd_link_info *, + struct elf_link_hash_entry **, + struct elf_link_hash_entry *, + Elf_Internal_Sym *, asection **, + bfd_vma *, unsigned int *, + bfd_boolean *, bfd_boolean *, + bfd_boolean *, bfd_boolean *, + bfd_boolean *, bfd_boolean *, + bfd_boolean *, bfd_boolean *, + bfd *, asection **, + bfd_boolean *, bfd_boolean *, + bfd_boolean *, bfd_boolean *, + bfd *, asection **); + + /* Used to handle bad SHF_LINK_ORDER input. */ + bfd_error_handler_type link_order_error_handler; + + /* Name of the PLT relocation section. */ + const char *relplt_name; /* Alternate EM_xxxx machine codes for this backend. */ int elf_machine_alt1; @@ -908,13 +1034,9 @@ struct elf_backend_data const struct elf_size_info *s; - /* An array of target specific special section map. */ + /* An array of target specific special sections. */ const struct bfd_elf_special_section *special_sections; - /* offset of the _GLOBAL_OFFSET_TABLE_ symbol from the start of the - .got section */ - bfd_vma got_symbol_offset; - /* The size in bytes of the header for the GOT. This includes the so-called reserved entries on some systems. */ bfd_vma got_header_size; @@ -994,8 +1116,7 @@ struct bfd_elf_section_data /* The number of relocations currently assigned to REL_HDR2. */ unsigned int rel_count2; - /* The ELF section number of this section. Only used for an output - file. */ + /* The ELF section number of this section. */ int this_idx; /* The ELF section number of the reloc section indicated by @@ -1012,6 +1133,9 @@ struct bfd_elf_section_data no dynamic symbol for this section. */ int dynindx; + /* A pointer to the linked-to section for SHF_LINK_ORDER. */ + asection *linked_to; + /* Used by the backend linker to store the symbol hash table entries associated with relocs against global symbols. */ struct elf_link_hash_entry **rel_hashes; @@ -1036,6 +1160,10 @@ struct bfd_elf_section_data struct bfd_symbol *id; } group; + /* Optional information about section group; NULL if it doesn't + belongs to any section group. */ + asection *sec_group; + /* A linked list of sections in the group. Circular when used by the linker. */ asection *next_in_group; @@ -1044,19 +1172,21 @@ struct bfd_elf_section_data void *sec_info; }; -#define elf_section_data(sec) ((struct bfd_elf_section_data*)sec->used_by_bfd) +#define elf_section_data(sec) ((struct bfd_elf_section_data*)(sec)->used_by_bfd) +#define elf_linked_to_section(sec) (elf_section_data(sec)->linked_to) #define elf_section_type(sec) (elf_section_data(sec)->this_hdr.sh_type) #define elf_section_flags(sec) (elf_section_data(sec)->this_hdr.sh_flags) #define elf_group_name(sec) (elf_section_data(sec)->group.name) #define elf_group_id(sec) (elf_section_data(sec)->group.id) #define elf_next_in_group(sec) (elf_section_data(sec)->next_in_group) +#define elf_sec_group(sec) (elf_section_data(sec)->sec_group) /* Return TRUE if section has been discarded. */ #define elf_discarded_section(sec) \ (!bfd_is_abs_section (sec) \ && bfd_is_abs_section ((sec)->output_section) \ - && sec->sec_info_type != ELF_INFO_TYPE_MERGE \ - && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS) + && (sec)->sec_info_type != ELF_INFO_TYPE_MERGE \ + && (sec)->sec_info_type != ELF_INFO_TYPE_JUST_SYMS) #define get_elf_backend_data(abfd) \ ((const struct elf_backend_data *) (abfd)->xvec->backend_data) @@ -1202,7 +1332,10 @@ struct elf_obj_tdata unsigned int cverrefs; /* Segment flags for the PT_GNU_STACK segment. */ - unsigned int stack_flags; + unsigned int stack_flags; + + /* Should the PT_GNU_RELRO segment be emitted? */ + bfd_boolean relro; /* Symbol version definitions in external objects. */ Elf_Internal_Verdef *verdef; @@ -1295,8 +1428,8 @@ extern char *bfd_elf_get_str_section extern Elf_Internal_Sym *bfd_elf_get_elf_syms (bfd *, Elf_Internal_Shdr *, size_t, size_t, Elf_Internal_Sym *, void *, Elf_External_Sym_Shndx *); -extern const char *bfd_elf_local_sym_name - (bfd *, Elf_Internal_Sym *); +extern const char *bfd_elf_sym_name + (bfd *, Elf_Internal_Shdr *, Elf_Internal_Sym *, asection *); extern bfd_boolean _bfd_elf_copy_private_bfd_data (bfd *, bfd *); @@ -1305,15 +1438,13 @@ extern bfd_boolean _bfd_elf_print_private_bfd_data extern void bfd_elf_print_symbol (bfd *, void *, asymbol *, bfd_print_symbol_type); -#define elf_string_from_elf_strtab(abfd, strindex) \ - bfd_elf_string_from_elf_section (abfd, elf_elfheader(abfd)->e_shstrndx, \ - strindex) - extern void _bfd_elf_sprintf_vma (bfd *, char *, bfd_vma); extern void _bfd_elf_fprintf_vma (bfd *, void *, bfd_vma); +extern unsigned int _bfd_elf_eh_frame_address_size + (bfd *, asection *); extern bfd_byte _bfd_elf_encode_eh_address (bfd *abfd, struct bfd_link_info *info, asection *osec, bfd_vma offset, asection *loc_sec, bfd_vma loc_offset, bfd_vma *encoded); @@ -1341,7 +1472,7 @@ extern bfd_boolean bfd_elf_mkcorefile extern Elf_Internal_Shdr *bfd_elf_find_section (bfd *, char *); extern bfd_boolean _bfd_elf_make_section_from_shdr - (bfd *, Elf_Internal_Shdr *, const char *); + (bfd *, Elf_Internal_Shdr *, const char *, int); extern bfd_boolean _bfd_elf_make_section_from_phdr (bfd *, Elf_Internal_Phdr *, int, const char *); extern struct bfd_hash_entry *_bfd_elf_link_hash_newfunc @@ -1349,26 +1480,41 @@ extern struct bfd_hash_entry *_bfd_elf_link_hash_newfunc extern struct bfd_link_hash_table *_bfd_elf_link_hash_table_create (bfd *); extern void _bfd_elf_link_hash_copy_indirect - (const struct elf_backend_data *, struct elf_link_hash_entry *, + (struct bfd_link_info *, struct elf_link_hash_entry *, struct elf_link_hash_entry *); extern void _bfd_elf_link_hash_hide_symbol (struct bfd_link_info *, struct elf_link_hash_entry *, bfd_boolean); +extern bfd_boolean _bfd_elf_link_hash_fixup_symbol + (struct bfd_link_info *, struct elf_link_hash_entry *); extern bfd_boolean _bfd_elf_link_hash_table_init (struct elf_link_hash_table *, bfd *, struct bfd_hash_entry *(*) - (struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); + (struct bfd_hash_entry *, struct bfd_hash_table *, const char *), + unsigned int); extern bfd_boolean _bfd_elf_slurp_version_tables - (bfd *); + (bfd *, bfd_boolean); extern bfd_boolean _bfd_elf_merge_sections (bfd *, struct bfd_link_info *); -extern bfd_boolean bfd_elf_discard_group +extern bfd_boolean _bfd_elf_match_sections_by_type + (bfd *, const asection *, bfd *, const asection *); +extern bfd_boolean bfd_elf_is_group_section + (bfd *, const struct bfd_section *); +extern void _bfd_elf_section_already_linked (bfd *, struct bfd_section *); extern void bfd_elf_set_group_contents (bfd *, asection *, void *); +extern asection *_bfd_elf_check_kept_section + (asection *); extern void _bfd_elf_link_just_syms (asection *, struct bfd_link_info *); +extern bfd_boolean _bfd_elf_copy_private_header_data + (bfd *, bfd *); extern bfd_boolean _bfd_elf_copy_private_symbol_data (bfd *, asymbol *, bfd *, asymbol *); +#define _bfd_generic_init_private_section_data \ + _bfd_elf_init_private_section_data +extern bfd_boolean _bfd_elf_init_private_section_data + (bfd *, asection *, bfd *, asection *, struct bfd_link_info *); extern bfd_boolean _bfd_elf_copy_private_section_data (bfd *, asection *, bfd *, asection *); extern bfd_boolean _bfd_elf_write_object_contents @@ -1385,6 +1531,8 @@ extern long _bfd_elf_get_dynamic_symtab_upper_bound (bfd *); extern long _bfd_elf_canonicalize_dynamic_symtab (bfd *, asymbol **); +extern long _bfd_elf_get_synthetic_symtab + (bfd *, long, asymbol **, long, asymbol **, asymbol **); extern long _bfd_elf_get_reloc_upper_bound (bfd *, sec_ptr); extern long _bfd_elf_canonicalize_reloc @@ -1406,6 +1554,11 @@ extern bfd_boolean _bfd_elf_set_arch_mach extern bfd_boolean _bfd_elf_find_nearest_line (bfd *, asection *, asymbol **, bfd_vma, const char **, const char **, unsigned int *); +extern bfd_boolean _bfd_elf_find_line + (bfd *, asymbol **, asymbol *, const char **, unsigned int *); +#define _bfd_generic_find_line _bfd_elf_find_line +extern bfd_boolean _bfd_elf_find_inliner_info + (bfd *, const char **, const char **, unsigned int *); #define _bfd_elf_read_minisymbols _bfd_generic_read_minisymbols #define _bfd_elf_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol extern int _bfd_elf_sizeof_headers @@ -1414,8 +1567,10 @@ extern bfd_boolean _bfd_elf_new_section_hook (bfd *, asection *); extern bfd_boolean _bfd_elf_init_reloc_shdr (bfd *, Elf_Internal_Shdr *, asection *, bfd_boolean); +extern const struct bfd_elf_special_section *_bfd_elf_get_special_section + (const char *, const struct bfd_elf_special_section *, unsigned int); extern const struct bfd_elf_special_section *_bfd_elf_get_sec_type_attr - (bfd *, const char *); + (bfd *, asection *); /* If the target doesn't have reloc handling written yet: */ extern void _bfd_elf_no_info_to_howto @@ -1463,7 +1618,7 @@ extern bfd_boolean _bfd_elf_discard_section_eh_frame extern bfd_boolean _bfd_elf_discard_section_eh_frame_hdr (bfd *, struct bfd_link_info *); extern bfd_vma _bfd_elf_eh_frame_section_offset - (bfd *, asection *, bfd_vma); + (bfd *, struct bfd_link_info *, asection *, bfd_vma); extern bfd_boolean _bfd_elf_write_section_eh_frame (bfd *, struct bfd_link_info *, asection *, bfd_byte *); extern bfd_boolean _bfd_elf_write_section_eh_frame_hdr @@ -1473,7 +1628,8 @@ extern bfd_boolean _bfd_elf_maybe_strip_eh_frame_hdr extern bfd_boolean _bfd_elf_merge_symbol (bfd *, struct bfd_link_info *, const char *, Elf_Internal_Sym *, - asection **, bfd_vma *, struct elf_link_hash_entry **, bfd_boolean *, + asection **, bfd_vma *, unsigned int *, + struct elf_link_hash_entry **, bfd_boolean *, bfd_boolean *, bfd_boolean *, bfd_boolean *); extern bfd_boolean _bfd_elf_add_default_symbol @@ -1504,12 +1660,14 @@ extern bfd_boolean _bfd_elf_validate_reloc extern bfd_boolean _bfd_elf_link_create_dynamic_sections (bfd *, struct bfd_link_info *); +extern bfd_boolean _bfd_elf_link_omit_section_dynsym + (bfd *, struct bfd_link_info *, asection *); extern bfd_boolean _bfd_elf_create_dynamic_sections (bfd *, struct bfd_link_info *); extern bfd_boolean _bfd_elf_create_got_section (bfd *, struct bfd_link_info *); -extern unsigned long _bfd_elf_link_renumber_dynsyms - (bfd *, struct bfd_link_info *); +extern struct elf_link_hash_entry *_bfd_elf_define_linkage_sym + (bfd *, struct bfd_link_info *, asection *, const char *); extern bfd_boolean _bfd_elfcore_make_pseudosection (bfd *, char *, size_t, ufile_ptr); @@ -1523,7 +1681,8 @@ extern bfd_boolean _bfd_elf_link_size_reloc_section (bfd *, Elf_Internal_Shdr *, asection *); extern bfd_boolean _bfd_elf_link_output_relocs - (bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *); + (bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *, + struct elf_link_hash_entry **); extern bfd_boolean _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *, struct elf_info_failed *); @@ -1540,6 +1699,12 @@ extern bfd_boolean _bfd_elf_dynamic_symbol_p extern bfd_boolean _bfd_elf_symbol_refs_local_p (struct elf_link_hash_entry *, struct bfd_link_info *, bfd_boolean); +extern bfd_boolean bfd_elf_match_symbols_in_sections + (asection *sec1, asection *sec2); + +extern bfd_boolean _bfd_elf_setup_sections + (bfd *); + extern const bfd_target *bfd_elf32_object_p (bfd *); extern const bfd_target *bfd_elf32_core_file_p @@ -1624,6 +1789,8 @@ extern void bfd_elf64_write_relocs extern bfd_boolean bfd_elf64_slurp_reloc_table (bfd *, asection *, asymbol **, bfd_boolean); +extern struct elf_link_hash_entry *_bfd_elf_archive_symbol_lookup + (bfd *, struct bfd_link_info *, const char *); extern bfd_boolean bfd_elf_link_add_symbols (bfd *, struct bfd_link_info *); extern bfd_boolean _bfd_elf_add_dynamic_entry @@ -1637,6 +1804,19 @@ extern int bfd_elf_link_record_local_dynamic_symbol extern bfd_boolean _bfd_elf_close_and_cleanup (bfd *); + +extern bfd_boolean _bfd_elf_common_definition + (Elf_Internal_Sym *); + +extern unsigned int _bfd_elf_common_section_index + (asection *); + +extern asection *_bfd_elf_common_section + (asection *); + +extern void _bfd_dwarf2_cleanup_debug_info + (bfd *); + extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn (bfd *, arelent *, struct bfd_symbol *, void *, asection *, bfd *, char **); @@ -1644,6 +1824,9 @@ extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn extern bfd_boolean bfd_elf_final_link (bfd *, struct bfd_link_info *); +extern bfd_boolean bfd_elf_gc_mark_dynamic_ref_symbol + (struct elf_link_hash_entry *h, void *inf); + extern bfd_boolean bfd_elf_gc_sections (bfd *, struct bfd_link_info *); @@ -1653,6 +1836,11 @@ extern bfd_boolean bfd_elf_gc_record_vtinherit extern bfd_boolean bfd_elf_gc_record_vtentry (bfd *, asection *, struct elf_link_hash_entry *, bfd_vma); +extern bfd_boolean _bfd_elf_gc_mark + (struct bfd_link_info *, asection *, + asection * (*) (asection *, struct bfd_link_info *, Elf_Internal_Rela *, + struct elf_link_hash_entry *, Elf_Internal_Sym *)); + extern bfd_boolean bfd_elf_gc_common_finalize_got_offsets (bfd *, struct bfd_link_info *); @@ -1662,6 +1850,10 @@ extern bfd_boolean bfd_elf_gc_common_final_link extern bfd_boolean bfd_elf_reloc_symbol_deleted_p (bfd_vma, void *); +extern struct elf_segment_map * +_bfd_elf_make_dynamic_segment + (bfd *, asection *); + /* Exported interface for writing elf corefile notes. */ extern char *elfcore_write_note (bfd *, char *, int *, const char *, int, const void *, int); @@ -1680,10 +1872,13 @@ extern char *elfcore_write_lwpstatus extern bfd *_bfd_elf32_bfd_from_remote_memory (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, - int (*target_read_memory) (bfd_vma, char *, int)); + int (*target_read_memory) (bfd_vma, bfd_byte *, int)); extern bfd *_bfd_elf64_bfd_from_remote_memory (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, - int (*target_read_memory) (bfd_vma, char *, int)); + int (*target_read_memory) (bfd_vma, bfd_byte *, int)); + +/* Large common section. */ +extern asection _bfd_elf_large_com_section; /* SH ELF specific routine. */ @@ -1695,10 +1890,8 @@ extern bfd_boolean _sh_elf_set_mach_from_flags about initializing any .plt and .got entries in relocate_section. */ #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \ ((DYN) \ - && ((SHARED) \ - || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \ - && ((H)->dynindx != -1 \ - || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)) + && ((SHARED) || !(H)->forced_local) \ + && ((H)->dynindx != -1 || (H)->forced_local)) /* This macro is to avoid lots of duplicated code in the body of xxx_relocate_section() in the various elfxx-xxxx.c files. */ |