X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf-bfd.h;h=b7ca2d0a5d50fc3574784ac042c37cbd96641809;hb=79697b649f28a6fc1062bb91737d9e64ee114ee6;hp=55522296b9075ad30704f193a657b63a924f6b0d;hpb=aa137e4d51ba6638b2714f8b3856d8abfd0bf143;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 55522296b9..b7ca2d0a5d 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1,7 +1,5 @@ /* BFD back-end data structures for ELF files. - Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1992-2015 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -29,6 +27,10 @@ #include "elf/internal.h" #include "bfdlink.h" +#ifdef __cplusplus +extern "C" { +#endif + /* The number of entries in a section is its size divided by the size of a single entry. This is normally only applicable to reloc and symbol table sections. @@ -106,6 +108,15 @@ struct elf_link_virtual_table_entry struct elf_link_hash_entry *parent; }; +/* ELF symbol version. */ +enum elf_symbol_version + { + unknown = 0, + unversioned, + versioned, + versioned_hidden + }; + /* ELF linker hash table entries. */ struct elf_link_hash_entry @@ -176,8 +187,8 @@ struct elf_link_hash_entry unsigned int needs_plt : 1; /* Symbol appears in a non-ELF input file. */ unsigned int non_elf : 1; - /* Symbol should be marked as hidden in the version information. */ - unsigned int hidden : 1; + /* Symbol version information. */ + ENUM_BITFIELD (elf_symbol_version) versioned : 2; /* Symbol was forced to local scope due to a version script file. */ unsigned int forced_local : 1; /* Symbol was forced to be dynamic due to a version script file. */ @@ -191,13 +202,16 @@ struct elf_link_hash_entry 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. */ - unsigned int dynamic_weak : 1; + /* Symbol has a non-weak reference from a shared object. */ + unsigned int ref_dynamic_nonweak : 1; /* Symbol is referenced with a relocation where C/C++ pointer equality matters. */ unsigned int pointer_equality_needed : 1; /* Symbol is a unique global symbol. */ unsigned int unique_global : 1; + /* Symbol is defined by a shared library with non-default visibility + in a read/write section. */ + unsigned int protected_def : 1; /* String table index in .dynstr if this is a dynamic symbol. */ unsigned long dynstr_index; @@ -241,7 +255,8 @@ struct elf_link_hash_entry _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. */ + DEF_REGULAR flag set, so they might appear to be undefined. + Symbols defined in linker scripts also don't have DEF_REGULAR set. */ #define ELF_COMMON_DEF_P(H) \ (!(H)->def_regular \ && !(H)->def_dynamic \ @@ -282,7 +297,9 @@ struct eh_cie_fde If REMOVED == 0, this is the CIE that we have chosen to use for the output FDE. The CIE's REMOVED field is also 0, but the CIE - might belong to a different .eh_frame input section from the FDE. */ + might belong to a different .eh_frame input section from the FDE. + + May be NULL to signify that the FDE should be discarded. */ struct eh_cie_fde *cie_inf; struct eh_cie_fde *next_for_section; } fde; @@ -374,25 +391,47 @@ struct eh_frame_sec_info struct eh_frame_array_ent { bfd_vma initial_loc; + bfd_size_type range; bfd_vma fde; }; struct htab; -struct eh_frame_hdr_info +#define DWARF2_EH_HDR 1 +#define COMPACT_EH_HDR 2 + +/* Endian-neutral code indicating that a function cannot be unwound. */ +#define COMPACT_EH_CANT_UNWIND_OPCODE 0x015d5d01 + +struct dwarf_eh_frame_hdr_info { struct htab *cies; - asection *hdr_sec; - unsigned int fde_count, array_count; - struct eh_frame_array_ent *array; - /* TRUE if we should try to merge CIEs between input sections. */ - bfd_boolean merge_cies; - /* TRUE if all .eh_frames have been parsd. */ - bfd_boolean parsed_eh_frames; + unsigned int fde_count; /* 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; + struct eh_frame_array_ent *array; +}; + +struct compact_eh_frame_hdr_info +{ + unsigned int allocated_entries; + /* eh_frame_entry fragments. */ + asection **entries; +}; + +struct eh_frame_hdr_info +{ + asection *hdr_sec; + unsigned int array_count; + bfd_boolean frame_hdr_is_compact; + union + { + struct dwarf_eh_frame_hdr_info dwarf; + struct compact_eh_frame_hdr_info compact; + } + u; }; /* Enum used to identify target specific extensions to the elf_obj_tdata @@ -402,7 +441,8 @@ struct eh_frame_hdr_info one line. */ enum elf_target_id { - ALPHA_ELF_DATA = 1, + AARCH64_ELF_DATA = 1, + ALPHA_ELF_DATA, ARM_ELF_DATA, AVR_ELF_DATA, BFIN_ELF_DATA, @@ -416,9 +456,13 @@ enum elf_target_id M32R_ELF_DATA, M68HC11_ELF_DATA, M68K_ELF_DATA, + METAG_ELF_DATA, MICROBLAZE_ELF_DATA, MIPS_ELF_DATA, MN10300_ELF_DATA, + NDS32_ELF_DATA, + NIOS2_ELF_DATA, + OR1K_ELF_DATA, PPC32_ELF_DATA, PPC64_ELF_DATA, S390_ELF_DATA, @@ -428,11 +472,19 @@ enum elf_target_id TIC6X_ELF_DATA, X86_64_ELF_DATA, XTENSA_ELF_DATA, + XGATE_ELF_DATA, TILEGX_ELF_DATA, TILEPRO_ELF_DATA, GENERIC_ELF_DATA }; +struct elf_sym_strtab +{ + Elf_Internal_Sym sym; + unsigned long dest_index; + unsigned long destshndx_index; +}; + /* ELF linker hash table. */ struct elf_link_hash_table @@ -476,6 +528,17 @@ struct elf_link_hash_table section. */ struct elf_strtab_hash *dynstr; + /* The number of symbol strings found in the link which must be put + into the .strtab section. */ + bfd_size_type strtabcount; + + /* The array size of the symbol string table, which becomes the + .strtab section. */ + bfd_size_type strtabsize; + + /* The array of strings, which becomes the .strtab section. */ + struct elf_sym_strtab *strtab; + /* The number of buckets in the hash table in the .hash section. This is based on the number of dynamic symbols. */ bfd_size_type bucketcount; @@ -496,6 +559,9 @@ struct elf_link_hash_table /* The _PROCEDURE_LINKAGE_TABLE_ symbol. */ struct elf_link_hash_entry *hplt; + /* The _DYNAMIC symbol. */ + struct elf_link_hash_entry *hdynamic; + /* A pointer to information used to merge SEC_MERGE sections. */ void *merge_info; @@ -529,6 +595,7 @@ struct elf_link_hash_table asection *iplt; asection *irelplt; asection *irelifunc; + asection *dynsym; }; /* Look up an entry in an ELF linker hash table. */ @@ -636,7 +703,8 @@ enum elf_reloc_type_class { reloc_class_normal, reloc_class_relative, reloc_class_plt, - reloc_class_copy + reloc_class_copy, + reloc_class_ifunc }; struct elf_reloc_cookie @@ -714,6 +782,10 @@ struct elf_backend_data /* The BFD flags applied to sections created for dynamic linking. */ flagword dynamic_sec_flags; + /* Architecture-specific data for this backend. + This is actually a pointer to some type like struct elf_ARCH_data. */ + const void *arch_data; + /* A function to translate an ELF RELA relocation to a BFD arelent structure. */ void (*elf_info_to_howto) @@ -871,12 +943,12 @@ struct elf_backend_data bfd_boolean (*check_directives) (bfd *abfd, struct bfd_link_info *info); - /* The AS_NEEDED_CLEANUP function is called once per --as-needed - input file that was not needed by the add_symbols phase of the - ELF backend linker. The function must undo any target specific - changes in the symbol hash table. */ - bfd_boolean (*as_needed_cleanup) - (bfd *abfd, struct bfd_link_info *info); + /* The NOTICE_AS_NEEDED function is called as the linker is about to + handle an as-needed lib (ACT = notice_as_needed), and after the + linker has decided to keep the lib (ACT = notice_needed) or when + the lib is not needed (ACT = notice_not_needed). */ + bfd_boolean (*notice_as_needed) + (bfd *abfd, struct bfd_link_info *info, enum notice_asneeded_action act); /* The ADJUST_DYNAMIC_SYMBOL function is called by the ELF backend linker for every symbol which is defined by a dynamic object and @@ -1098,6 +1170,11 @@ struct elf_backend_data unsigned int (*elf_backend_count_relocs) (struct bfd_link_info *, asection *); + /* Say whether to sort relocs output by ld -r and ld --emit-relocs, + by r_offset. If NULL, default to true. */ + bfd_boolean (*sort_relocs_p) + (asection *); + /* This function, if defined, is called when an NT_PRSTATUS note is found in a core file. */ bfd_boolean (*elf_backend_grok_prstatus) @@ -1112,9 +1189,14 @@ struct elf_backend_data char *(*elf_backend_write_core_note) (bfd *abfd, char *buf, int *bufsiz, int note_type, ...); + /* This function, if defined, is called to convert target-specific + section flag names into hex values. */ + flagword (*elf_backend_lookup_section_flags_hook) + (char *); + /* This function returns class of a reloc type. */ enum elf_reloc_type_class (*elf_backend_reloc_type_class) - (const Elf_Internal_Rela *); + (const struct bfd_link_info *, const asection *, const Elf_Internal_Rela *); /* This function, if defined, removes information about discarded functions from other sections which mention them. */ @@ -1175,8 +1257,9 @@ struct elf_backend_data /* This function implements `bfd_elf_bfd_from_remote_memory'; 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, bfd_byte *myaddr, int len)); + (bfd *templ, bfd_vma ehdr_vma, bfd_size_type size, bfd_vma *loadbasep, + int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr, + bfd_size_type len)); /* This function is used by `_bfd_elf_get_synthetic_symtab'; see elf.c. */ @@ -1192,19 +1275,10 @@ struct elf_backend_data 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 **); + bfd_boolean (*merge_symbol) (struct elf_link_hash_entry *, + const Elf_Internal_Sym *, asection **, + bfd_boolean, bfd_boolean, + bfd *, const asection *); /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */ bfd_boolean (*elf_hash_symbol) (struct elf_link_hash_entry *); @@ -1212,6 +1286,15 @@ struct elf_backend_data /* Return TRUE if type is a function symbol type. */ bfd_boolean (*is_function_type) (unsigned int type); + /* If the ELF symbol SYM might be a function in SEC, return the + function size and set *CODE_OFF to the function's entry point, + otherwise return zero. */ + bfd_size_type (*maybe_function_sym) (const asymbol *sym, asection *sec, + bfd_vma *code_off); + + /* Return the section which RELOC_SEC applies to. */ + asection *(*get_reloc_section) (asection *reloc_sec); + /* Used to handle bad SHF_LINK_ORDER input. */ bfd_error_handler_type link_order_error_handler; @@ -1261,9 +1344,18 @@ struct elf_backend_data or give an error and return FALSE. */ bfd_boolean (*obj_attrs_handle_unknown) (bfd *, int); + /* Encoding used for compact EH tables. */ + int (*compact_eh_encoding) (struct bfd_link_info *); + + /* Opcode representing no unwind. */ + int (*cant_unwind_opcode) (struct bfd_link_info *); + /* This is non-zero if static TLS segments require a special alignment. */ unsigned static_tls_alignment; + /* Alignment for the PT_GNU_STACK segment. */ + unsigned stack_align; + /* This is TRUE if the linker should act like collect and gather global constructors and destructors by name. This is TRUE for MIPS ELF because the Irix 5 tools can not handle the .init @@ -1325,6 +1417,15 @@ struct elf_backend_data other file in the link needs to have a .note.GNU-stack section for a PT_GNU_STACK segment to be created. */ unsigned default_execstack : 1; + + /* True if elf_section_data(sec)->this_hdr.contents is sec->rawsize + in length rather than sec->size in length, if sec->rawsize is + non-zero and smaller than sec->size. */ + unsigned caches_rawsize : 1; + + /* Address of protected data defined in the shared library may be + external, i.e., due to copy relocation. */ + unsigned extern_protected_data : 1; }; /* Information about reloc sections associated with a bfd_elf_section_data @@ -1352,6 +1453,9 @@ struct bfd_elf_section_data /* The ELF header for this section. */ Elf_Internal_Shdr this_hdr; + /* INPUT_SECTION_FLAGS if specified in the linker script. */ + struct flag_info *section_flag_info; + /* Information about the REL and RELA reloc sections associated with this section, if any. */ struct bfd_elf_section_reloc_data rel, rela; @@ -1400,19 +1504,23 @@ struct bfd_elf_section_data field acts as a chain pointer. */ struct eh_cie_fde *fde_list; + /* Link from a text section to its .eh_frame_entry section. */ + asection *eh_frame_entry; + /* A pointer used for various section optimizations. */ 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_fde_list(sec) (elf_section_data(sec)->fde_list) +#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_fde_list(sec) (elf_section_data(sec)->fde_list) #define elf_sec_group(sec) (elf_section_data(sec)->sec_group) +#define elf_section_eh_frame_entry(sec) (elf_section_data(sec)->eh_frame_entry) #define xvec_get_elf_backend_data(xvec) \ ((const struct elf_backend_data *) (xvec)->backend_data) @@ -1451,7 +1559,7 @@ typedef struct obj_attribute typedef struct obj_attribute_list { struct obj_attribute_list *next; - int tag; + unsigned int tag; obj_attribute attr; } obj_attribute_list; @@ -1483,6 +1591,77 @@ struct sdt_note bfd_byte data[1]; }; +/* tdata information grabbed from an elf core file. */ +struct core_elf_obj_tdata +{ + int signal; + int pid; + int lwpid; + char* program; + char* command; +}; + +/* Extra tdata information held for output ELF BFDs. */ +struct output_elf_obj_tdata +{ + struct elf_segment_map *seg_map; + struct elf_strtab_hash *strtab_ptr; + + /* STT_SECTION symbols for each section */ + asymbol **section_syms; + + /* Used to determine if PT_GNU_EH_FRAME segment header should be + created. */ + asection *eh_frame_hdr; + + /* NT_GNU_BUILD_ID note type info. */ + struct + { + bfd_boolean (*after_write_object_contents) (bfd *); + const char *style; + asection *sec; + } build_id; + + /* Records the result of `get_program_header_size'. */ + bfd_size_type program_header_size; + + /* Used when laying out sections. */ + file_ptr next_file_pos; + + int num_section_syms; + unsigned int shstrtab_section, strtab_section; + + /* Segment flags for the PT_GNU_STACK segment. */ + unsigned int stack_flags; + + /* This is set to TRUE if the object was created by the backend + linker. */ + bfd_boolean linker; + + /* Used to determine if the e_flags field has been initialized */ + bfd_boolean flags_init; +}; + +/* Indicate if the bfd contains symbols that have the STT_GNU_IFUNC + symbol type or STB_GNU_UNIQUE binding. Used to set the osabi + field in the ELF header structure. */ +enum elf_gnu_symbols + { + elf_gnu_symbol_none = 0, + elf_gnu_symbol_any = 1 << 0, + elf_gnu_symbol_ifunc = (elf_gnu_symbol_any | 1 << 1), + elf_gnu_symbol_unique = (elf_gnu_symbol_any | 1 << 2), + elf_gnu_symbol_all = (elf_gnu_symbol_ifunc | elf_gnu_symbol_unique) + }; + +typedef struct elf_section_list +{ + Elf_Internal_Shdr hdr; + unsigned int ndx; + struct elf_section_list * next; +} elf_section_list; + + /* Some private data is stashed away for future use using the tdata pointer in the bfd structure. */ @@ -1491,13 +1670,6 @@ struct elf_obj_tdata Elf_Internal_Ehdr elf_header[1]; /* Actual data, but ref like ptr */ Elf_Internal_Shdr **elf_sect_ptr; Elf_Internal_Phdr *phdr; - struct elf_segment_map *segment_map; - struct elf_strtab_hash *strtab_ptr; - int num_locals; - int num_globals; - unsigned int num_elf_sections; /* elf_sect_ptr size */ - int num_section_syms; - asymbol **section_syms; /* STT_SECTION symbols for each section */ Elf_Internal_Shdr symtab_hdr; Elf_Internal_Shdr shstrtab_hdr; Elf_Internal_Shdr strtab_hdr; @@ -1506,21 +1678,10 @@ struct elf_obj_tdata Elf_Internal_Shdr dynversym_hdr; Elf_Internal_Shdr dynverref_hdr; Elf_Internal_Shdr dynverdef_hdr; - Elf_Internal_Shdr symtab_shndx_hdr; - unsigned int symtab_section, shstrtab_section; - unsigned int strtab_section, dynsymtab_section; - unsigned int symtab_shndx_section; - unsigned int dynversym_section, dynverdef_section, dynverref_section; - file_ptr next_file_pos; + elf_section_list * symtab_shndx_list; bfd_vma gp; /* The gp value */ unsigned int gp_size; /* The gp size */ - - /* Information grabbed from an elf core file. */ - int core_signal; - int core_pid; - int core_lwpid; - char* core_program; - char* core_command; + unsigned int num_elf_sections; /* elf_sect_ptr size */ /* A mapping from external symbols to entries in the linker hash table, used when linking. This is indexed by the symbol index @@ -1548,39 +1709,20 @@ struct elf_obj_tdata const char *dt_name; /* The linker emulation needs to know what audit libs - are used by a dynamic object. */ + are used by a dynamic object. */ const char *dt_audit; - /* Records the result of `get_program_header_size'. */ - bfd_size_type program_header_size; - /* Used by find_nearest_line entry point. */ void *line_info; - /* Used by MIPS ELF find_nearest_line entry point. The structure - could be included directly in this one, but there's no point to - wasting the memory just for the infrequently called - find_nearest_line. */ - struct mips_elf_find_line *find_line_info; - /* A place to stash dwarf1 info for this bfd. */ struct dwarf1_debug *dwarf1_find_line_info; /* A place to stash dwarf2 info for this bfd. */ void *dwarf2_find_line_info; - /* An array of stub sections indexed by symbol number, used by the - MIPS ELF linker. FIXME: We should figure out some way to only - include this field for a MIPS ELF target. */ - asection **local_stubs; - asection **local_call_stubs; - - /* Used to determine if PT_GNU_EH_FRAME segment header should be - created. */ - asection *eh_frame_hdr; - - Elf_Internal_Shdr **group_sect_ptr; - int num_group; + /* Stash away info for yet another find line/function variant. */ + void *elf_find_function_cache; /* Number of symbol version definitions we are about to emit. */ unsigned int cverdefs; @@ -1588,83 +1730,74 @@ struct elf_obj_tdata /* Number of symbol version references we are about to emit. */ unsigned int cverrefs; - /* Segment flags for the PT_GNU_STACK segment. */ - unsigned int stack_flags; - /* Symbol version definitions in external objects. */ Elf_Internal_Verdef *verdef; /* Symbol version references to external objects. */ Elf_Internal_Verneed *verref; - /* The Irix 5 support uses two virtual sections, which represent - text/data symbols defined in dynamic objects. */ - asymbol *elf_data_symbol; - asymbol *elf_text_symbol; - asection *elf_data_section; - asection *elf_text_section; - /* A pointer to the .eh_frame section. */ asection *eh_frame_section; - /* Whether a dyanmic object was specified normally on the linker - command line, or was specified when --as-needed was in effect, - or was found via a DT_NEEDED entry. */ - enum dynamic_lib_link_class dyn_lib_class; - - /* This is set to TRUE if the object was created by the backend - linker. */ - bfd_boolean linker; - - /* Irix 5 often screws up the symbol table, sorting local symbols - after global symbols. This flag is set if the symbol table in - this BFD appears to be screwed up. If it is, we ignore the - sh_info field in the symbol table header, and always read all the - symbols. */ - bfd_boolean bad_symtab; - - /* Used to determine if the e_flags field has been initialized */ - bfd_boolean flags_init; - /* Symbol buffer. */ void *symbuf; obj_attribute known_obj_attributes[2][NUM_KNOWN_OBJ_ATTRIBUTES]; obj_attribute_list *other_obj_attributes[2]; - /* Called at the end of _bfd_elf_write_object_contents if not NULL. */ - bfd_boolean (*after_write_object_contents) (bfd *); - void *after_write_object_contents_info; - - /* NT_GNU_BUILD_ID note type. */ - bfd_size_type build_id_size; - bfd_byte *build_id; - /* Linked-list containing information about every Systemtap section found in the object file. Each section corresponds to one entry in the list. */ struct sdt_note *sdt_note_head; - /* True if the bfd contains symbols that have the STT_GNU_IFUNC - symbol type or STB_GNU_UNIQUE binding. Used to set the osabi - field in the ELF header structure. */ - bfd_boolean has_gnu_symbols; + Elf_Internal_Shdr **group_sect_ptr; + int num_group; + + unsigned int symtab_section, dynsymtab_section; + unsigned int dynversym_section, dynverdef_section, dynverref_section; /* An identifier used to distinguish different target specific extensions to this structure. */ enum elf_target_id object_id; + + /* Whether a dyanmic object was specified normally on the linker + command line, or was specified when --as-needed was in effect, + or was found via a DT_NEEDED entry. */ + enum dynamic_lib_link_class dyn_lib_class; + + /* Irix 5 often screws up the symbol table, sorting local symbols + after global symbols. This flag is set if the symbol table in + this BFD appears to be screwed up. If it is, we ignore the + sh_info field in the symbol table header, and always read all the + symbols. */ + bfd_boolean bad_symtab; + + enum elf_gnu_symbols has_gnu_symbols; + + /* Information grabbed from an elf core file. */ + struct core_elf_obj_tdata *core; + + /* More information held for output ELF BFDs. */ + struct output_elf_obj_tdata *o; }; #define elf_tdata(bfd) ((bfd) -> tdata.elf_obj_data) #define elf_object_id(bfd) (elf_tdata(bfd) -> object_id) -#define elf_program_header_size(bfd) (elf_tdata(bfd) -> program_header_size) +#define elf_program_header_size(bfd) (elf_tdata(bfd) -> o->program_header_size) #define elf_elfheader(bfd) (elf_tdata(bfd) -> elf_header) #define elf_elfsections(bfd) (elf_tdata(bfd) -> elf_sect_ptr) #define elf_numsections(bfd) (elf_tdata(bfd) -> num_elf_sections) -#define elf_shstrtab(bfd) (elf_tdata(bfd) -> strtab_ptr) +#define elf_seg_map(bfd) (elf_tdata(bfd) -> o->seg_map) +#define elf_next_file_pos(bfd) (elf_tdata(bfd) -> o->next_file_pos) +#define elf_eh_frame_hdr(bfd) (elf_tdata(bfd) -> o->eh_frame_hdr) +#define elf_linker(bfd) (elf_tdata(bfd) -> o->linker) +#define elf_stack_flags(bfd) (elf_tdata(bfd) -> o->stack_flags) +#define elf_shstrtab(bfd) (elf_tdata(bfd) -> o->strtab_ptr) #define elf_onesymtab(bfd) (elf_tdata(bfd) -> symtab_section) -#define elf_symtab_shndx(bfd) (elf_tdata(bfd) -> symtab_shndx_section) +#define elf_symtab_shndx_list(bfd) (elf_tdata(bfd) -> symtab_shndx_list) +#define elf_strtab_sec(bfd) (elf_tdata(bfd) -> o->strtab_section) +#define elf_shstrtab_sec(bfd) (elf_tdata(bfd) -> o->shstrtab_section) #define elf_symtab_hdr(bfd) (elf_tdata(bfd) -> symtab_hdr) #define elf_dynsymtab(bfd) (elf_tdata(bfd) -> dynsymtab_section) #define elf_dynversym(bfd) (elf_tdata(bfd) -> dynversym_section) @@ -1672,10 +1805,8 @@ struct elf_obj_tdata #define elf_dynverref(bfd) (elf_tdata(bfd) -> dynverref_section) #define elf_eh_frame_section(bfd) \ (elf_tdata(bfd) -> eh_frame_section) -#define elf_num_locals(bfd) (elf_tdata(bfd) -> num_locals) -#define elf_num_globals(bfd) (elf_tdata(bfd) -> num_globals) -#define elf_section_syms(bfd) (elf_tdata(bfd) -> section_syms) -#define elf_num_section_syms(bfd) (elf_tdata(bfd) -> num_section_syms) +#define elf_section_syms(bfd) (elf_tdata(bfd) -> o->section_syms) +#define elf_num_section_syms(bfd) (elf_tdata(bfd) -> o->num_section_syms) #define core_prpsinfo(bfd) (elf_tdata(bfd) -> prpsinfo) #define core_prstatus(bfd) (elf_tdata(bfd) -> prstatus) #define elf_gp(bfd) (elf_tdata(bfd) -> gp) @@ -1688,7 +1819,7 @@ struct elf_obj_tdata #define elf_dt_audit(bfd) (elf_tdata(bfd) -> dt_audit) #define elf_dyn_lib_class(bfd) (elf_tdata(bfd) -> dyn_lib_class) #define elf_bad_symtab(bfd) (elf_tdata(bfd) -> bad_symtab) -#define elf_flags_init(bfd) (elf_tdata(bfd) -> flags_init) +#define elf_flags_init(bfd) (elf_tdata(bfd) -> o->flags_init) #define elf_known_obj_attributes(bfd) (elf_tdata (bfd) -> known_obj_attributes) #define elf_other_obj_attributes(bfd) (elf_tdata (bfd) -> other_obj_attributes) #define elf_known_obj_attributes_proc(bfd) \ @@ -1731,6 +1862,8 @@ extern bfd_boolean _bfd_elf_copy_private_bfd_data (bfd *, bfd *); extern bfd_boolean _bfd_elf_print_private_bfd_data (bfd *, void *); +const char * _bfd_elf_get_symbol_version_string + (bfd *, asymbol *, bfd_boolean *); extern void bfd_elf_print_symbol (bfd *, void *, asymbol *, bfd_print_symbol_type); @@ -1743,7 +1876,8 @@ extern bfd_boolean _bfd_elf_can_make_relative (bfd *input_bfd, struct bfd_link_info *info, asection *eh_frame_section); extern enum elf_reloc_type_class _bfd_elf_reloc_type_class - (const Elf_Internal_Rela *); + (const struct bfd_link_info *, const asection *, + const Elf_Internal_Rela *); extern bfd_vma _bfd_elf_rela_local_sym (bfd *, Elf_Internal_Sym *, asection **, Elf_Internal_Rela *); extern bfd_vma _bfd_elf_rel_local_sym @@ -1772,6 +1906,8 @@ extern struct bfd_hash_entry *_bfd_elf_link_hash_newfunc (struct bfd_hash_entry *, struct bfd_hash_table *, const char *); extern struct bfd_link_hash_table *_bfd_elf_link_hash_table_create (bfd *); +extern void _bfd_elf_link_hash_table_free + (bfd *); extern void _bfd_elf_link_hash_copy_indirect (struct bfd_link_info *, struct elf_link_hash_entry *, struct elf_link_hash_entry *); @@ -1792,14 +1928,13 @@ 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 *, struct bfd_link_info *); +extern bfd_boolean _bfd_elf_section_already_linked + (bfd *, asection *, struct bfd_link_info *); extern void bfd_elf_set_group_contents (bfd *, asection *, void *); extern asection *_bfd_elf_check_kept_section (asection *, struct bfd_link_info *); -extern void _bfd_elf_link_just_syms - (asection *, struct bfd_link_info *); +#define _bfd_elf_link_just_syms _bfd_generic_link_just_syms extern void _bfd_elf_copy_link_hash_symbol_type (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); extern bfd_boolean _bfd_elf_size_group_sections @@ -1855,21 +1990,20 @@ extern alent *_bfd_elf_get_lineno extern bfd_boolean _bfd_elf_set_arch_mach (bfd *, enum bfd_architecture, unsigned long); extern bfd_boolean _bfd_elf_find_nearest_line - (bfd *, asection *, asymbol **, bfd_vma, const char **, const char **, - unsigned int *); + (bfd *, asymbol **, asection *, bfd_vma, + const char **, const char **, unsigned int *, 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 *); +extern bfd_boolean _bfd_elf_find_function + (bfd *, asymbol **, asection *, bfd_vma, const char **, const char **); #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 (bfd *, struct bfd_link_info *); extern bfd_boolean _bfd_elf_new_section_hook (bfd *, asection *); -extern bfd_boolean _bfd_elf_init_reloc_shdr - (bfd *, struct bfd_elf_section_reloc_data *, 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 @@ -1887,12 +2021,10 @@ extern bfd_boolean bfd_section_from_phdr extern int _bfd_elf_symbol_from_bfd_symbol (bfd *, asymbol **); -extern Elf_Internal_Sym *bfd_sym_from_r_symndx +extern Elf_Internal_Sym *bfd_sym_from_r_symndx (struct sym_cache *, bfd *, unsigned long); extern asection *bfd_section_from_elf_index (bfd *, unsigned int); -extern struct bfd_strtab_hash *_bfd_elf_stringtab_init - (void); extern struct elf_strtab_hash * _bfd_elf_strtab_init (void); @@ -1904,8 +2036,12 @@ extern void _bfd_elf_strtab_addref (struct elf_strtab_hash *, bfd_size_type); extern void _bfd_elf_strtab_delref (struct elf_strtab_hash *, bfd_size_type); +extern unsigned int _bfd_elf_strtab_refcount + (struct elf_strtab_hash *, bfd_size_type); extern void _bfd_elf_strtab_clear_all_refs - (struct elf_strtab_hash *); + (struct elf_strtab_hash *tab); +extern void _bfd_elf_strtab_restore_size + (struct elf_strtab_hash *, bfd_size_type); extern bfd_size_type _bfd_elf_strtab_size (struct elf_strtab_hash *); extern bfd_size_type _bfd_elf_strtab_offset @@ -1915,11 +2051,13 @@ extern bfd_boolean _bfd_elf_strtab_emit extern void _bfd_elf_strtab_finalize (struct elf_strtab_hash *); -extern void _bfd_elf_begin_eh_frame_parsing - (struct bfd_link_info *info); +extern bfd_boolean bfd_elf_parse_eh_frame_entries + (bfd *, struct bfd_link_info *); +extern bfd_boolean _bfd_elf_parse_eh_frame_entry + (struct bfd_link_info *, asection *, struct elf_reloc_cookie *); extern void _bfd_elf_parse_eh_frame (bfd *, struct bfd_link_info *, asection *, struct elf_reloc_cookie *); -extern void _bfd_elf_end_eh_frame_parsing +extern bfd_boolean _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info); extern bfd_boolean _bfd_elf_discard_section_eh_frame @@ -1931,25 +2069,24 @@ extern bfd_vma _bfd_elf_eh_frame_section_offset (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 *); +bfd_boolean _bfd_elf_write_section_eh_frame_entry + (bfd *, struct bfd_link_info *, asection *, bfd_byte *); +extern bfd_boolean _bfd_elf_fixup_eh_frame_hdr (struct bfd_link_info *); extern bfd_boolean _bfd_elf_write_section_eh_frame_hdr (bfd *, struct bfd_link_info *); +extern bfd_boolean _bfd_elf_eh_frame_present + (struct bfd_link_info *); +extern bfd_boolean _bfd_elf_eh_frame_entry_present + (struct bfd_link_info *); extern bfd_boolean _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *); -extern bfd_boolean _bfd_elf_merge_symbol - (bfd *, struct bfd_link_info *, const char *, Elf_Internal_Sym *, - asection **, bfd_vma *, unsigned int *, - struct elf_link_hash_entry **, bfd_boolean *, - bfd_boolean *, bfd_boolean *, bfd_boolean *); - extern bfd_boolean _bfd_elf_hash_symbol (struct elf_link_hash_entry *); extern long _bfd_elf_link_lookup_local_dynindx (struct bfd_link_info *, bfd *, long); extern bfd_boolean _bfd_elf_compute_section_file_positions (bfd *, struct bfd_link_info *); -extern void _bfd_elf_assign_file_positions_for_relocs - (bfd *); extern file_ptr _bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *, file_ptr, bfd_boolean); @@ -1964,6 +2101,8 @@ 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 asection *_bfd_elf_section_for_symbol + (struct elf_reloc_cookie *, unsigned long, bfd_boolean); extern struct elf_link_hash_entry *_bfd_elf_define_linkage_sym (bfd *, struct bfd_link_info *, asection *, const char *); extern void _bfd_elf_init_1_index_section @@ -1984,7 +2123,7 @@ extern bfd_boolean _bfd_elf_link_output_relocs struct elf_link_hash_entry **); extern bfd_boolean _bfd_elf_adjust_dynamic_copy - (struct elf_link_hash_entry *, asection *); + (struct bfd_link_info *, struct elf_link_hash_entry *, asection *); extern bfd_boolean _bfd_elf_dynamic_symbol_p (struct elf_link_hash_entry *, struct bfd_link_info *, bfd_boolean); @@ -1998,7 +2137,7 @@ extern bfd_reloc_status_type bfd_elf_perform_complex_relocation extern bfd_boolean _bfd_elf_setup_sections (bfd *); -extern void _bfd_elf_set_osabi (bfd * , struct bfd_link_info *); +extern void _bfd_elf_post_process_headers (bfd * , struct bfd_link_info *); extern const bfd_target *bfd_elf32_object_p (bfd *); @@ -2097,6 +2236,8 @@ extern bfd_boolean _bfd_elf_default_relocs_compatible extern bfd_boolean _bfd_elf_relocs_compatible (const bfd_target *, const bfd_target *); +extern bfd_boolean _bfd_elf_notice_as_needed + (bfd *, struct bfd_link_info *, enum notice_asneeded_action); extern struct elf_link_hash_entry *_bfd_elf_archive_symbol_lookup (bfd *, struct bfd_link_info *, const char *); @@ -2123,9 +2264,6 @@ extern unsigned int _bfd_elf_common_section_index extern asection *_bfd_elf_common_section (asection *); -extern void _bfd_dwarf2_cleanup_debug_info - (bfd *); - extern bfd_vma _bfd_elf_default_got_elt_size (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, bfd *, unsigned long); @@ -2171,6 +2309,9 @@ extern bfd_boolean _bfd_elf_gc_mark_fdes extern bfd_boolean _bfd_elf_gc_mark (struct bfd_link_info *, asection *, elf_gc_mark_hook_fn); +extern bfd_boolean _bfd_elf_gc_mark_extra_sections + (struct bfd_link_info *, elf_gc_mark_hook_fn); + extern bfd_boolean bfd_elf_gc_common_finalize_got_offsets (bfd *, struct bfd_link_info *); @@ -2188,8 +2329,16 @@ extern bfd_boolean _bfd_elf_map_sections_to_segments extern bfd_boolean _bfd_elf_is_function_type (unsigned int); +extern bfd_size_type _bfd_elf_maybe_function_sym (const asymbol *, asection *, + bfd_vma *); + +extern asection *_bfd_elf_get_reloc_section (asection *); + extern int bfd_elf_get_default_section_type (flagword); +extern bfd_boolean bfd_elf_lookup_section_flags + (struct bfd_link_info *, struct flag_info *, asection *); + extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section (bfd * abfd, asection * section); @@ -2222,36 +2371,90 @@ extern char *elfcore_write_s390_ctrs (bfd *, char *, int *, const void *, int); extern char *elfcore_write_s390_prefix (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_s390_last_break + (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_s390_system_call + (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_s390_tdb + (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_s390_vxrs_low + (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_s390_vxrs_high + (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_arm_vfp + (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_aarch_tls + (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_aarch_hw_break + (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_aarch_hw_watch + (bfd *, char *, int *, const void *, int); extern char *elfcore_write_lwpstatus (bfd *, char *, int *, long, int, const void *); extern char *elfcore_write_register_note (bfd *, char *, int *, const char *, const void *, int); +/* Internal structure which holds information to be included in the + PRPSINFO section of Linux core files. + + This is an "internal" structure in the sense that it should be used + to pass information to BFD (via the `elfcore_write_linux_prpsinfo' + function), so things like endianess shouldn't be an issue. This + structure will eventually be converted in one of the + `elf_external_linux_*' structures and written out to an output bfd + by one of the functions declared below. */ + +struct elf_internal_linux_prpsinfo + { + char pr_state; /* Numeric process state. */ + char pr_sname; /* Char for pr_state. */ + char pr_zomb; /* Zombie. */ + char pr_nice; /* Nice val. */ + unsigned long pr_flag; /* Flags. */ + unsigned int pr_uid; + unsigned int pr_gid; + int pr_pid, pr_ppid, pr_pgrp, pr_sid; + char pr_fname[16 + 1]; /* Filename of executable. */ + char pr_psargs[80 + 1]; /* Initial part of arg list. */ + }; + +/* Linux/most 32-bit archs. */ +extern char *elfcore_write_linux_prpsinfo32 + (bfd *, char *, int *, const struct elf_internal_linux_prpsinfo *); + +/* Linux/most 64-bit archs. */ +extern char *elfcore_write_linux_prpsinfo64 + (bfd *, char *, int *, const struct elf_internal_linux_prpsinfo *); + +/* Linux/PPC32 uses different layout compared to most archs. */ +extern char *elfcore_write_ppc_linux_prpsinfo32 + (bfd *, char *, int *, const struct elf_internal_linux_prpsinfo *); + extern bfd *_bfd_elf32_bfd_from_remote_memory - (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, - int (*target_read_memory) (bfd_vma, bfd_byte *, int)); + (bfd *templ, bfd_vma ehdr_vma, bfd_size_type size, bfd_vma *loadbasep, + int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type)); extern bfd *_bfd_elf64_bfd_from_remote_memory - (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, - int (*target_read_memory) (bfd_vma, bfd_byte *, int)); + (bfd *templ, bfd_vma ehdr_vma, bfd_size_type size, bfd_vma *loadbasep, + int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type)); extern bfd_vma bfd_elf_obj_attr_size (bfd *); extern void bfd_elf_set_obj_attr_contents (bfd *, bfd_byte *, bfd_vma); -extern int bfd_elf_get_obj_attr_int (bfd *, int, int); -extern void bfd_elf_add_obj_attr_int (bfd *, int, int, unsigned int); +extern int bfd_elf_get_obj_attr_int (bfd *, int, unsigned int); +extern void bfd_elf_add_obj_attr_int (bfd *, int, unsigned int, unsigned int); #define bfd_elf_add_proc_attr_int(BFD, TAG, VALUE) \ bfd_elf_add_obj_attr_int ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE)) -extern void bfd_elf_add_obj_attr_string (bfd *, int, int, const char *); +extern void bfd_elf_add_obj_attr_string (bfd *, int, unsigned int, const char *); #define bfd_elf_add_proc_attr_string(BFD, TAG, VALUE) \ bfd_elf_add_obj_attr_string ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE)) -extern void bfd_elf_add_obj_attr_int_string (bfd *, int, int, unsigned int, - const char *); +extern void bfd_elf_add_obj_attr_int_string (bfd *, int, unsigned int, + unsigned int, const char *); #define bfd_elf_add_proc_attr_int_string(BFD, TAG, INTVAL, STRVAL) \ bfd_elf_add_obj_attr_int_string ((BFD), OBJ_ATTR_PROC, (TAG), \ (INTVAL), (STRVAL)) extern char *_bfd_elf_attr_strdup (bfd *, const char *); extern void _bfd_elf_copy_obj_attributes (bfd *, bfd *); -extern int _bfd_elf_obj_attrs_arg_type (bfd *, int, int); +extern int _bfd_elf_obj_attrs_arg_type (bfd *, int, unsigned int); extern void _bfd_elf_parse_attributes (bfd *, Elf_Internal_Shdr *); extern bfd_boolean _bfd_elf_merge_object_attributes (bfd *, bfd *); extern bfd_boolean _bfd_elf_merge_unknown_attribute_low (bfd *, bfd *, int); @@ -2280,12 +2483,12 @@ struct elf_dyn_relocs extern bfd_boolean _bfd_elf_create_ifunc_sections (bfd *, struct bfd_link_info *); -extern asection * _bfd_elf_create_ifunc_dyn_reloc - (bfd *, struct bfd_link_info *, asection *sec, asection *sreloc, - struct elf_dyn_relocs **); extern bfd_boolean _bfd_elf_allocate_ifunc_dyn_relocs (struct bfd_link_info *, struct elf_link_hash_entry *, - struct elf_dyn_relocs **, unsigned int, unsigned int); + struct elf_dyn_relocs **, unsigned int, unsigned int, unsigned int); +extern long _bfd_elf_ifunc_get_synthetic_symtab + (bfd *, long, asymbol **, long, asymbol **, asymbol **, asection *, + bfd_vma *(*) (bfd *, asymbol **, asection *, asection *)); extern void elf_append_rela (bfd *, asection *, Elf_Internal_Rela *); extern void elf_append_rel (bfd *, asection *, Elf_Internal_Rela *); @@ -2317,7 +2520,7 @@ extern asection _bfd_elf_large_com_section; #define RELOC_FOR_GLOBAL_SYMBOL(info, input_bfd, input_section, rel, \ r_symndx, symtab_hdr, sym_hashes, \ h, sec, relocation, \ - unresolved_reloc, warned) \ + unresolved_reloc, warned, ignored) \ do \ { \ /* It seems this can happen with erroneous or unsupported \ @@ -2327,11 +2530,17 @@ extern asection _bfd_elf_large_com_section; \ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; \ \ + if (info->wrap_hash != NULL \ + && (input_section->flags & SEC_DEBUGGING) != 0) \ + h = ((struct elf_link_hash_entry *) \ + unwrap_hash_lookup (info, input_bfd, &h->root)); \ + \ while (h->root.type == bfd_link_hash_indirect \ || h->root.type == bfd_link_hash_warning) \ h = (struct elf_link_hash_entry *) h->root.u.i.link; \ \ warned = FALSE; \ + ignored = FALSE; \ unresolved_reloc = FALSE; \ relocation = 0; \ if (h->root.type == bfd_link_hash_defined \ @@ -2354,8 +2563,8 @@ extern asection _bfd_elf_large_com_section; ; \ else if (info->unresolved_syms_in_objects == RM_IGNORE \ && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) \ - ; \ - else if (!info->relocatable) \ + ignored = TRUE; \ + else if (!bfd_link_relocatable (info)) \ { \ bfd_boolean err; \ err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR \ @@ -2370,24 +2579,27 @@ extern asection _bfd_elf_large_com_section; } \ (void) unresolved_reloc; \ (void) warned; \ + (void) ignored; \ } \ while (0) /* This macro is to avoid lots of duplicated code in the body of the loop over relocations in xxx_relocate_section() in the various elfxx-xxxx.c files. - + Handle relocations against symbols from removed linkonce sections, or sections discarded by a linker script. When doing a relocatable link, we remove such relocations. Otherwise, we just want the section contents zeroed and avoid any special processing. */ #define RELOC_AGAINST_DISCARDED_SECTION(info, input_bfd, input_section, \ - rel, relend, howto, contents) \ + rel, count, relend, \ + howto, index, contents) \ { \ + int i_; \ _bfd_clear_contents (howto, input_bfd, input_section, \ - contents + rel->r_offset); \ + contents + rel[index].r_offset); \ \ - if (info->relocatable \ + if (bfd_link_relocatable (info) \ && (input_section->flags & SEC_DEBUGGING)) \ { \ /* Only remove relocations in debug sections since other \ @@ -2403,24 +2615,32 @@ extern asection _bfd_elf_large_com_section; rel_hdr = _bfd_elf_single_rel_hdr (input_section); \ rel_hdr->sh_size -= rel_hdr->sh_entsize; \ \ - memmove (rel, rel + 1, (relend - rel - 1) * sizeof (*rel)); \ + memmove (rel, rel + count, \ + (relend - rel - count) * sizeof (*rel)); \ \ input_section->reloc_count--; \ - relend--; \ + relend -= count; \ rel--; \ continue; \ } \ } \ \ - rel->r_info = 0; \ - rel->r_addend = 0; \ + for (i_ = 0; i_ < count; i_++) \ + { \ + rel[i_].r_info = 0; \ + rel[i_].r_addend = 0; \ + } \ + rel += count - 1; \ continue; \ } -/* Will a symbol be bound to the the definition within the shared +/* Will a symbol be bound to the definition within the shared library, if any. A unique symbol can never be bound locally. */ #define SYMBOLIC_BIND(INFO, H) \ (!(H)->unique_global \ && ((INFO)->symbolic || ((INFO)->dynamic && !(H)->dynamic))) +#ifdef __cplusplus +} +#endif #endif /* _LIBELF_H_ */