| Index: bfd/elf-bfd.h
|
| diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
|
| index 889ce128b4b526ad731af03bee0688b7a3774d4c..15dab945705883552537bda047214cf0f7063bc1 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, 2012
|
| - Free Software Foundation, Inc.
|
| + Copyright 1992-2013 Free Software Foundation, Inc.
|
| Written by Cygnus Support.
|
|
|
| This file is part of BFD, the Binary File Descriptor library.
|
| @@ -191,8 +189,8 @@ 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;
|
| @@ -402,7 +400,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 +415,11 @@ 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,
|
| + NIOS2_ELF_DATA,
|
| PPC32_ELF_DATA,
|
| PPC64_ELF_DATA,
|
| S390_ELF_DATA,
|
| @@ -497,6 +498,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;
|
|
|
| @@ -637,7 +641,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
|
| @@ -876,12 +881,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
|
| @@ -1124,7 +1129,7 @@ struct elf_backend_data
|
|
|
| /* 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. */
|
| @@ -1203,19 +1208,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 *);
|
| @@ -1281,6 +1277,9 @@ struct elf_backend_data
|
| /* 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
|
| @@ -1503,6 +1502,64 @@ struct sdt_note
|
| bfd_byte data[1];
|
| };
|
|
|
| +/* NT_GNU_BUILD_ID note type info for input BFDs. */
|
| +struct elf_build_id
|
| +{
|
| + size_t size;
|
| + 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;
|
| +};
|
| +
|
| /* Some private data is stashed away for future use using the tdata pointer
|
| in the bfd structure. */
|
|
|
| @@ -1511,13 +1568,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;
|
| @@ -1527,20 +1577,9 @@ struct elf_obj_tdata
|
| 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;
|
| 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
|
| @@ -1571,36 +1610,17 @@ struct elf_obj_tdata
|
| 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;
|
| @@ -1608,83 +1628,80 @@ 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;
|
| + struct elf_build_id *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;
|
|
|
| + Elf_Internal_Shdr **group_sect_ptr;
|
| + int num_group;
|
| +
|
| + unsigned int symtab_section, symtab_shndx_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;
|
| +
|
| /* 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;
|
|
|
| - /* An identifier used to distinguish different target
|
| - specific extensions to this structure. */
|
| - enum elf_target_id object_id;
|
| + /* 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_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)
|
| @@ -1692,10 +1709,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)
|
| @@ -1708,7 +1723,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) \
|
| @@ -1763,7 +1778,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
|
| @@ -1792,6 +1808,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
|
| + (struct bfd_link_hash_table *);
|
| extern void _bfd_elf_link_hash_copy_indirect
|
| (struct bfd_link_info *, struct elf_link_hash_entry *,
|
| struct elf_link_hash_entry *);
|
| @@ -1876,9 +1894,16 @@ 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_nearest_line_discriminator
|
| + (bfd *, asection *, asymbol **, bfd_vma, const char **, const char **,
|
| + unsigned int *, unsigned int *);
|
| extern bfd_boolean _bfd_elf_find_line
|
| (bfd *, asymbol **, asymbol *, const char **, unsigned int *);
|
| +extern bfd_boolean _bfd_elf_find_line_discriminator
|
| + (bfd *, asymbol **, asymbol *, const char **, unsigned int *, unsigned int *);
|
| #define _bfd_generic_find_line _bfd_elf_find_line
|
| +#define _bfd_generic_find_nearest_line_discriminator \
|
| + _bfd_elf_find_nearest_line_discriminator
|
| extern bfd_boolean _bfd_elf_find_inliner_info
|
| (bfd *, const char **, const char **, unsigned int *);
|
| #define _bfd_elf_read_minisymbols _bfd_generic_read_minisymbols
|
| @@ -1887,8 +1912,6 @@ 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
|
| @@ -1923,8 +1946,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
|
| @@ -1957,12 +1984,6 @@ extern bfd_boolean _bfd_elf_eh_frame_present
|
| 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
|
| @@ -2118,6 +2139,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 *);
|
| @@ -2253,13 +2276,57 @@ 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_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 *, bfd_size_type));
|
| @@ -2313,12 +2380,9 @@ 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 void elf_append_rela (bfd *, asection *, Elf_Internal_Rela *);
|
| extern void elf_append_rel (bfd *, asection *, Elf_Internal_Rela *);
|
| @@ -2350,7 +2414,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 \
|
| @@ -2365,6 +2429,7 @@ extern asection _bfd_elf_large_com_section;
|
| 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 \
|
| @@ -2387,7 +2452,7 @@ extern asection _bfd_elf_large_com_section;
|
| ; \
|
| else if (info->unresolved_syms_in_objects == RM_IGNORE \
|
| && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) \
|
| - ; \
|
| + ignored = TRUE; \
|
| else if (!info->relocatable) \
|
| { \
|
| bfd_boolean err; \
|
| @@ -2403,6 +2468,7 @@ extern asection _bfd_elf_large_com_section;
|
| } \
|
| (void) unresolved_reloc; \
|
| (void) warned; \
|
| + (void) ignored; \
|
| } \
|
| while (0)
|
|
|
| @@ -2432,16 +2498,16 @@ extern asection _bfd_elf_large_com_section;
|
| rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section); \
|
| \
|
| /* Avoid empty output section. */ \
|
| - if (rel_hdr->sh_size > count * rel_hdr->sh_entsize) \
|
| + if (rel_hdr->sh_size > rel_hdr->sh_entsize) \
|
| { \
|
| - rel_hdr->sh_size -= count * rel_hdr->sh_entsize; \
|
| + rel_hdr->sh_size -= rel_hdr->sh_entsize; \
|
| rel_hdr = _bfd_elf_single_rel_hdr (input_section); \
|
| - rel_hdr->sh_size -= count * rel_hdr->sh_entsize; \
|
| + rel_hdr->sh_size -= rel_hdr->sh_entsize; \
|
| \
|
| memmove (rel, rel + count, \
|
| (relend - rel - count) * sizeof (*rel)); \
|
| \
|
| - input_section->reloc_count -= count; \
|
| + input_section->reloc_count--; \
|
| relend -= count; \
|
| rel--; \
|
| continue; \
|
| @@ -2457,7 +2523,7 @@ extern asection _bfd_elf_large_com_section;
|
| 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 \
|
|
|