#ifndef _LIBELF_H_
#define _LIBELF_H_ 1
#include "bfd.h"
#include "elf/common.h"
#include "elf/internal.h"
#include "elf/external.h"
#include "bfdlink.h"
#define NUM_SHDR_ENTRIES(shdr) ((shdr)->sh_size / (shdr)->sh_entsize)
#ifndef NAME
#if ARCH_SIZE == 64
#define NAME(x, y) x ## 64 ## _ ## y
#endif
#if ARCH_SIZE == 32
#define NAME(x, y) x ## 32 ## _ ## y
#endif
#endif
#ifndef NAME
#define NAME(x, y) x ## NOSIZE ## _ ## y
#endif
#define ElfNAME(X) NAME(Elf,X)
#define elfNAME(X) NAME(elf,X)
typedef struct
{
asymbol symbol;
Elf_Internal_Sym internal_elf_sym;
union
{
unsigned int hppa_arg_reloc;
void *mips_extr;
void *any;
}
tc_data;
unsigned short version;
} elf_symbol_type;
struct elf_strtab_hash;
struct got_entry;
struct plt_entry;
struct elf_link_hash_entry
{
struct bfd_link_hash_entry root;
long indx;
long dynindx;
union gotplt_union
{
bfd_signed_vma refcount;
bfd_vma offset;
struct got_entry *glist;
struct plt_entry *plist;
} got;
union gotplt_union plt;
bfd_size_type size;
unsigned int type : 8;
unsigned int other : 8;
unsigned int ref_regular : 1;
unsigned int def_regular : 1;
unsigned int ref_dynamic : 1;
unsigned int def_dynamic : 1;
unsigned int ref_regular_nonweak : 1;
unsigned int dynamic_adjusted : 1;
unsigned int needs_copy : 1;
unsigned int needs_plt : 1;
unsigned int non_elf : 1;
unsigned int hidden : 1;
unsigned int forced_local : 1;
unsigned int mark : 1;
unsigned int non_got_ref : 1;
unsigned int dynamic_def : 1;
unsigned int dynamic_weak : 1;
unsigned int pointer_equality_needed : 1;
unsigned long dynstr_index;
union
{
struct elf_link_hash_entry *weakdef;
unsigned long elf_hash_value;
} u;
union
{
Elf_Internal_Verdef *verdef;
struct bfd_elf_version_tree *vertree;
} verinfo;
struct
{
size_t size;
bfd_boolean *used;
struct elf_link_hash_entry *parent;
} *vtable;
};
#define SYMBOL_REFERENCES_LOCAL(INFO, H) \
_bfd_elf_symbol_refs_local_p (H, INFO, 0)
#define SYMBOL_CALLS_LOCAL(INFO, H) \
_bfd_elf_symbol_refs_local_p (H, INFO, 1)
#define ELF_COMMON_DEF_P(H) \
(!(H)->def_regular \
&& !(H)->def_dynamic \
&& (H)->root.type == bfd_link_hash_defined)
struct elf_link_local_dynamic_entry
{
struct elf_link_local_dynamic_entry *next;
bfd *input_bfd;
long input_indx;
long dynindx;
Elf_Internal_Sym isym;
};
struct elf_link_loaded_list
{
struct elf_link_loaded_list *next;
bfd *abfd;
};
struct cie_header
{
unsigned int length;
unsigned int id;
};
struct cie
{
struct cie_header hdr;
unsigned char version;
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;
unsigned char fde_encoding;
unsigned char initial_insn_length;
unsigned char make_relative;
unsigned char make_lsda_relative;
unsigned char initial_instructions[50];
};
struct eh_cie_fde
{
struct eh_cie_fde *cie_inf;
unsigned int size;
unsigned int offset;
unsigned int new_offset;
unsigned char fde_encoding;
unsigned char lsda_encoding;
unsigned char lsda_offset;
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
{
unsigned int count;
unsigned int alloced;
struct eh_cie_fde entry[1];
};
struct eh_frame_array_ent
{
bfd_vma initial_loc;
bfd_vma fde;
};
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 fde_count, array_count;
struct eh_frame_array_ent *array;
bfd_boolean table;
bfd_boolean offsets_adjusted;
};
struct elf_link_hash_table
{
struct bfd_link_hash_table root;
bfd_boolean dynamic_sections_created;
bfd *dynobj;
union gotplt_union init_got_refcount;
union gotplt_union init_plt_refcount;
union gotplt_union init_got_offset;
union gotplt_union init_plt_offset;
bfd_size_type dynsymcount;
struct elf_strtab_hash *dynstr;
bfd_size_type bucketcount;
struct bfd_link_needed_list *needed;
struct elf_link_hash_entry *hgot;
void *merge_info;
struct stab_info stab_info;
struct eh_frame_hdr_info eh_info;
struct elf_link_local_dynamic_entry *dynlocal;
struct bfd_link_needed_list *runpath;
asection *tls_sec;
bfd_size_type tls_size;
struct elf_link_loaded_list *loaded;
bfd_boolean is_relocatable_executable;
};
#define elf_link_hash_lookup(table, string, create, copy, follow) \
((struct elf_link_hash_entry *) \
bfd_link_hash_lookup (&(table)->root, (string), (create), \
(copy), (follow)))
#define elf_link_hash_traverse(table, func, info) \
(bfd_link_hash_traverse \
(&(table)->root, \
(bfd_boolean (*) (struct bfd_link_hash_entry *, void *)) (func), \
(info)))
#define elf_hash_table(p) ((struct elf_link_hash_table *) ((p)->hash))
#define is_elf_hash_table(htab) \
(((struct bfd_link_hash_table *) (htab))->type == bfd_link_elf_hash_table)
#define LOCAL_SYM_CACHE_SIZE 32
struct sym_sec_cache
{
bfd *abfd;
unsigned long indx[LOCAL_SYM_CACHE_SIZE];
asection *sec[LOCAL_SYM_CACHE_SIZE];
};
struct elf_size_info {
unsigned char sizeof_ehdr, sizeof_phdr, sizeof_shdr;
unsigned char sizeof_rel, sizeof_rela, sizeof_sym, sizeof_dyn, sizeof_note;
unsigned char sizeof_hash_entry;
unsigned char int_rels_per_ext_rel;
#define MAX_INT_RELS_PER_EXT_REL 3
unsigned char arch_size, log_file_align;
unsigned char elfclass, ev_current;
int (*write_out_phdrs)
(bfd *, const Elf_Internal_Phdr *, unsigned int);
bfd_boolean
(*write_shdrs_and_ehdr) (bfd *);
void (*write_relocs)
(bfd *, asection *, void *);
void (*swap_symbol_in)
(bfd *, const void *, const void *, Elf_Internal_Sym *);
void (*swap_symbol_out)
(bfd *, const Elf_Internal_Sym *, void *, void *);
bfd_boolean (*slurp_reloc_table)
(bfd *, asection *, asymbol **, bfd_boolean);
long (*slurp_symbol_table)
(bfd *, asymbol **, bfd_boolean);
void (*swap_dyn_in)
(bfd *, const void *, Elf_Internal_Dyn *);
void (*swap_dyn_out)
(bfd *, const Elf_Internal_Dyn *, void *);
void (*swap_reloc_in)
(bfd *, const bfd_byte *, Elf_Internal_Rela *);
void (*swap_reloc_out)
(bfd *, const Elf_Internal_Rela *, bfd_byte *);
void (*swap_reloca_in)
(bfd *, const bfd_byte *, Elf_Internal_Rela *);
void (*swap_reloca_out)
(bfd *, const Elf_Internal_Rela *, bfd_byte *);
};
#define elf_symbol_from(ABFD,S) \
(((S)->the_bfd->xvec->flavour == bfd_target_elf_flavour \
&& (S)->the_bfd->tdata.elf_obj_data != 0) \
? (elf_symbol_type *) (S) \
: 0)
enum elf_reloc_type_class {
reloc_class_normal,
reloc_class_relative,
reloc_class_plt,
reloc_class_copy
};
struct elf_reloc_cookie
{
Elf_Internal_Rela *rels, *rel, *relend;
Elf_Internal_Sym *locsyms;
bfd *abfd;
size_t locsymcount;
size_t extsymoff;
struct elf_link_hash_entry **sym_hashes;
int r_sym_shift;
bfd_boolean bad_symtab;
};
typedef enum {
ict_none,
ict_irix5,
ict_irix6
} irix_compat_t;
struct bfd_elf_special_section
{
const char *prefix;
int prefix_length;
int suffix_length;
int type;
int attr;
};
enum action_discarded
{
COMPLAIN = 1,
PRETEND = 2
};
struct elf_backend_data
{
enum bfd_architecture arch;
int elf_machine_code;
bfd_vma maxpagesize;
bfd_vma minpagesize;
flagword dynamic_sec_flags;
void (*elf_info_to_howto)
(bfd *, arelent *, Elf_Internal_Rela *);
void (*elf_info_to_howto_rel)
(bfd *, arelent *, Elf_Internal_Rela *);
bfd_boolean (*elf_backend_sym_is_global)
(bfd *, asymbol *);
bfd_boolean (*elf_backend_object_p)
(bfd *);
void (*elf_backend_symbol_processing)
(bfd *, asymbol *);
bfd_boolean (*elf_backend_symbol_table_processing)
(bfd *, elf_symbol_type *, unsigned int);
int (*elf_backend_get_symbol_type)
(Elf_Internal_Sym *, int);
struct elf_link_hash_entry * (*elf_backend_archive_symbol_lookup)
(bfd *, struct bfd_link_info *, const char *);
bfd_boolean (*elf_backend_name_local_section_symbols)
(bfd *);
bfd_boolean (*elf_backend_section_processing)
(bfd *, Elf_Internal_Shdr *);
bfd_boolean (*elf_backend_section_from_shdr)
(bfd *, Elf_Internal_Shdr *, const char *, int);
bfd_boolean (*elf_backend_section_flags)
(flagword *, const Elf_Internal_Shdr *);
const struct bfd_elf_special_section * (*get_sec_type_attr)
(bfd *, asection *);
bfd_boolean (*elf_backend_section_from_phdr)
(bfd *, Elf_Internal_Phdr *, int, const char *);
bfd_boolean (*elf_backend_fake_sections)
(bfd *, Elf_Internal_Shdr *, asection *);
bfd_boolean (*elf_backend_section_from_bfd_section)
(bfd *, asection *, int *retval);
bfd_boolean (*elf_add_symbol_hook)
(bfd *abfd, struct bfd_link_info *info, Elf_Internal_Sym *,
const char **name, flagword *flags, asection **sec, bfd_vma *value);
bfd_boolean (*elf_backend_link_output_symbol_hook)
(struct bfd_link_info *info, const char *, Elf_Internal_Sym *,
asection *, struct elf_link_hash_entry *);
bfd_boolean (*elf_backend_create_dynamic_sections)
(bfd *abfd, struct bfd_link_info *info);
bfd_boolean (*elf_backend_omit_section_dynsym)
(bfd *output_bfd, struct bfd_link_info *info, asection *osec);
bfd_boolean (*check_relocs)
(bfd *abfd, struct bfd_link_info *info, asection *o,
const Elf_Internal_Rela *relocs);
bfd_boolean (*check_directives)
(bfd *abfd, struct bfd_link_info *info);
bfd_boolean (*elf_backend_adjust_dynamic_symbol)
(struct bfd_link_info *info, struct elf_link_hash_entry *h);
bfd_boolean (*elf_backend_always_size_sections)
(bfd *output_bfd, struct bfd_link_info *info);
bfd_boolean (*elf_backend_size_dynamic_sections)
(bfd *output_bfd, struct bfd_link_info *info);
bfd_boolean (*elf_backend_relocate_section)
(bfd *output_bfd, struct bfd_link_info *info, bfd *input_bfd,
asection *input_section, bfd_byte *contents, Elf_Internal_Rela *relocs,
Elf_Internal_Sym *local_syms, asection **local_sections);
bfd_boolean (*elf_backend_finish_dynamic_symbol)
(bfd *output_bfd, struct bfd_link_info *info,
struct elf_link_hash_entry *h, Elf_Internal_Sym *sym);
bfd_boolean (*elf_backend_finish_dynamic_sections)
(bfd *output_bfd, struct bfd_link_info *info);
void (*elf_backend_begin_write_processing)
(bfd *, struct bfd_link_info *);
void (*elf_backend_final_write_processing)
(bfd *, bfd_boolean linker);
int (*elf_backend_additional_program_headers)
(bfd *);
bfd_boolean (*elf_backend_modify_segment_map)
(bfd *, struct bfd_link_info *);
asection * (*gc_mark_hook)
(asection *sec, struct bfd_link_info *, Elf_Internal_Rela *,
struct elf_link_hash_entry *h, Elf_Internal_Sym *);
bfd_boolean (*gc_sweep_hook)
(bfd *abfd, struct bfd_link_info *info, asection *o,
const Elf_Internal_Rela *relocs);
void (*elf_backend_post_process_headers)
(bfd *, struct bfd_link_info *);
const char *(*elf_backend_print_symbol_all)
(bfd *, void *, asymbol *);
bfd_boolean (*elf_backend_output_arch_syms)
(bfd *, struct bfd_link_info *, void *,
bfd_boolean (*) (void *, const char *, Elf_Internal_Sym *, asection *,
struct elf_link_hash_entry *));
void (*elf_backend_copy_indirect_symbol)
(const struct elf_backend_data *, struct elf_link_hash_entry *,
struct elf_link_hash_entry *);
void (*elf_backend_hide_symbol)
(struct bfd_link_info *, struct elf_link_hash_entry *, bfd_boolean);
void (*elf_backend_merge_symbol_attribute)
(struct elf_link_hash_entry *, const Elf_Internal_Sym *, bfd_boolean,
bfd_boolean);
bfd_boolean (*elf_backend_emit_relocs)
(bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *,
struct elf_link_hash_entry **);
unsigned int (*elf_backend_count_relocs)
(asection *, Elf_Internal_Rela *);
bfd_boolean (*elf_backend_grok_prstatus)
(bfd *, Elf_Internal_Note *);
bfd_boolean (*elf_backend_grok_psinfo)
(bfd *, Elf_Internal_Note *);
void (* elf_backend_sprintf_vma)
(bfd *, char *, bfd_vma);
void (* elf_backend_fprintf_vma)
(bfd *, void *, bfd_vma);
enum elf_reloc_type_class (*elf_backend_reloc_type_class)
(const Elf_Internal_Rela *);
bfd_boolean (*elf_backend_discard_info)
(bfd *, struct elf_reloc_cookie *, struct bfd_link_info *);
bfd_boolean (*elf_backend_ignore_discarded_relocs)
(asection *);
unsigned int (*action_discarded)
(asection *);
unsigned int (*elf_backend_eh_frame_address_size)
(bfd *, asection *);
bfd_boolean (*elf_backend_can_make_relative_eh_frame)
(bfd *, struct bfd_link_info *, asection *);
bfd_boolean (*elf_backend_can_make_lsda_relative_eh_frame)
(bfd *, struct bfd_link_info *, asection *);
bfd_byte (*elf_backend_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);
bfd_boolean (*elf_backend_write_section)
(bfd *, asection *, bfd_byte *);
irix_compat_t (*elf_backend_mips_irix_compat)
(bfd *);
reloc_howto_type *(*elf_backend_mips_rtype_to_howto)
(unsigned int, bfd_boolean);
const struct ecoff_debug_swap *elf_backend_ecoff_debug_swap;
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_vma (*plt_sym_val) (bfd_vma, const asection *, const arelent *);
bfd_boolean (*common_definition) (Elf_Internal_Sym *);
unsigned int (*common_section_index) (asection *);
asection *(*common_section) (asection *);
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_error_handler_type link_order_error_handler;
const char *relplt_name;
int elf_machine_alt1;
int elf_machine_alt2;
const struct elf_size_info *s;
const struct bfd_elf_special_section *special_sections;
bfd_vma got_header_size;
unsigned collect : 1;
unsigned type_change_ok : 1;
unsigned may_use_rel_p : 1;
unsigned may_use_rela_p : 1;
unsigned default_use_rela_p : 1;
unsigned rela_normal : 1;
unsigned sign_extend_vma : 1;
unsigned want_got_plt : 1;
unsigned plt_readonly : 1;
unsigned want_plt_sym : 1;
unsigned plt_not_loaded : 1;
unsigned plt_alignment : 4;
unsigned can_gc_sections : 1;
unsigned can_refcount : 1;
unsigned want_got_sym : 1;
unsigned want_dynbss : 1;
unsigned want_p_paddr_set_to_zero : 1;
};
struct bfd_elf_section_data
{
Elf_Internal_Shdr this_hdr;
Elf_Internal_Shdr rel_hdr;
Elf_Internal_Shdr *rel_hdr2;
unsigned int rel_count;
unsigned int rel_count2;
int this_idx;
int rel_idx;
int rel_idx2;
int dynindx;
asection *linked_to;
struct elf_link_hash_entry **rel_hashes;
Elf_Internal_Rela *relocs;
void *local_dynrel;
asection *sreloc;
union {
const char *name;
struct bfd_symbol *id;
} group;
asection *sec_group;
asection *next_in_group;
void *sec_info;
};
#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)
#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)
#define get_elf_backend_data(abfd) \
((const struct elf_backend_data *) (abfd)->xvec->backend_data)
struct elf_info_failed
{
bfd_boolean failed;
struct bfd_link_info *info;
struct bfd_elf_version_tree *verdefs;
};
struct elf_assign_sym_version_info
{
bfd *output_bfd;
struct bfd_link_info *info;
struct bfd_elf_version_tree *verdefs;
bfd_boolean failed;
};
struct elf_find_verdep_info
{
bfd *output_bfd;
struct bfd_link_info *info;
unsigned int vers;
bfd_boolean failed;
};
struct elf_obj_tdata
{
Elf_Internal_Ehdr elf_header[1];
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;
int num_section_syms;
asymbol **section_syms;
Elf_Internal_Shdr symtab_hdr;
Elf_Internal_Shdr shstrtab_hdr;
Elf_Internal_Shdr strtab_hdr;
Elf_Internal_Shdr dynsymtab_hdr;
Elf_Internal_Shdr dynstrtab_hdr;
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;
bfd_vma gp;
unsigned int gp_size;
int core_signal;
int core_pid;
int core_lwpid;
char* core_program;
char* core_command;
struct elf_link_hash_entry **sym_hashes;
union
{
bfd_signed_vma *refcounts;
bfd_vma *offsets;
struct got_entry **ents;
} local_got;
const char *dt_name;
bfd_size_type program_header_size;
void *line_info;
struct mips_elf_find_line *find_line_info;
struct dwarf1_debug *dwarf1_find_line_info;
void *dwarf2_find_line_info;
asection **local_stubs;
asection *eh_frame_hdr;
Elf_Internal_Shdr **group_sect_ptr;
int num_group;
unsigned int cverdefs;
unsigned int cverrefs;
unsigned int stack_flags;
bfd_boolean relro;
Elf_Internal_Verdef *verdef;
Elf_Internal_Verneed *verref;
asymbol *elf_data_symbol;
asymbol *elf_text_symbol;
asection *elf_data_section;
asection *elf_text_section;
enum dynamic_lib_link_class dyn_lib_class;
bfd_boolean linker;
bfd_boolean bad_symtab;
bfd_boolean flags_init;
};
#define elf_tdata(bfd) ((bfd) -> tdata.elf_obj_data)
#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_onesymtab(bfd) (elf_tdata(bfd) -> symtab_section)
#define elf_symtab_shndx(bfd) (elf_tdata(bfd) -> symtab_shndx_section)
#define elf_dynsymtab(bfd) (elf_tdata(bfd) -> dynsymtab_section)
#define elf_dynversym(bfd) (elf_tdata(bfd) -> dynversym_section)
#define elf_dynverdef(bfd) (elf_tdata(bfd) -> dynverdef_section)
#define elf_dynverref(bfd) (elf_tdata(bfd) -> dynverref_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 core_prpsinfo(bfd) (elf_tdata(bfd) -> prpsinfo)
#define core_prstatus(bfd) (elf_tdata(bfd) -> prstatus)
#define elf_gp(bfd) (elf_tdata(bfd) -> gp)
#define elf_gp_size(bfd) (elf_tdata(bfd) -> gp_size)
#define elf_sym_hashes(bfd) (elf_tdata(bfd) -> sym_hashes)
#define elf_local_got_refcounts(bfd) (elf_tdata(bfd) -> local_got.refcounts)
#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got.offsets)
#define elf_local_got_ents(bfd) (elf_tdata(bfd) -> local_got.ents)
#define elf_dt_name(bfd) (elf_tdata(bfd) -> dt_name)
#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)
extern void _bfd_elf_swap_verdef_in
(bfd *, const Elf_External_Verdef *, Elf_Internal_Verdef *);
extern void _bfd_elf_swap_verdef_out
(bfd *, const Elf_Internal_Verdef *, Elf_External_Verdef *);
extern void _bfd_elf_swap_verdaux_in
(bfd *, const Elf_External_Verdaux *, Elf_Internal_Verdaux *);
extern void _bfd_elf_swap_verdaux_out
(bfd *, const Elf_Internal_Verdaux *, Elf_External_Verdaux *);
extern void _bfd_elf_swap_verneed_in
(bfd *, const Elf_External_Verneed *, Elf_Internal_Verneed *);
extern void _bfd_elf_swap_verneed_out
(bfd *, const Elf_Internal_Verneed *, Elf_External_Verneed *);
extern void _bfd_elf_swap_vernaux_in
(bfd *, const Elf_External_Vernaux *, Elf_Internal_Vernaux *);
extern void _bfd_elf_swap_vernaux_out
(bfd *, const Elf_Internal_Vernaux *, Elf_External_Vernaux *);
extern void _bfd_elf_swap_versym_in
(bfd *, const Elf_External_Versym *, Elf_Internal_Versym *);
extern void _bfd_elf_swap_versym_out
(bfd *, const Elf_Internal_Versym *, Elf_External_Versym *);
extern int _bfd_elf_section_from_bfd_section
(bfd *, asection *);
extern char *bfd_elf_string_from_elf_section
(bfd *, unsigned, unsigned);
extern char *bfd_elf_get_str_section
(bfd *, unsigned);
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_sym_name
(bfd *, Elf_Internal_Shdr *, Elf_Internal_Sym *, asection *);
extern bfd_boolean _bfd_elf_copy_private_bfd_data
(bfd *, bfd *);
extern bfd_boolean _bfd_elf_print_private_bfd_data
(bfd *, void *);
extern void bfd_elf_print_symbol
(bfd *, void *, asymbol *, bfd_print_symbol_type);
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);
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 *);
extern bfd_vma _bfd_elf_rela_local_sym
(bfd *, Elf_Internal_Sym *, asection **, Elf_Internal_Rela *);
extern bfd_vma _bfd_elf_rel_local_sym
(bfd *, Elf_Internal_Sym *, asection **, bfd_vma);
extern bfd_vma _bfd_elf_section_offset
(bfd *, struct bfd_link_info *, asection *, bfd_vma);
extern unsigned long bfd_elf_hash
(const char *);
extern bfd_reloc_status_type bfd_elf_generic_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
extern bfd_boolean bfd_elf_mkobject
(bfd *);
extern bfd_boolean bfd_elf_mkcorefile
(bfd *);
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 *, 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
(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_copy_indirect
(const struct elf_backend_data *, 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_table_init
(struct elf_link_hash_table *, bfd *,
struct bfd_hash_entry *(*)
(struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
extern bfd_boolean _bfd_elf_slurp_version_tables
(bfd *, bfd_boolean);
extern bfd_boolean _bfd_elf_merge_sections
(bfd *, struct bfd_link_info *);
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 *);
extern bfd_boolean _bfd_elf_copy_private_section_data
(bfd *, asection *, bfd *, asection *);
extern bfd_boolean _bfd_elf_write_object_contents
(bfd *);
extern bfd_boolean _bfd_elf_write_corefile_contents
(bfd *);
extern bfd_boolean _bfd_elf_set_section_contents
(bfd *, sec_ptr, const void *, file_ptr, bfd_size_type);
extern long _bfd_elf_get_symtab_upper_bound
(bfd *);
extern long _bfd_elf_canonicalize_symtab
(bfd *, asymbol **);
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
(bfd *, sec_ptr, arelent **, asymbol **);
extern long _bfd_elf_get_dynamic_reloc_upper_bound
(bfd *);
extern long _bfd_elf_canonicalize_dynamic_reloc
(bfd *, arelent **, asymbol **);
extern asymbol *_bfd_elf_make_empty_symbol
(bfd *);
extern void _bfd_elf_get_symbol_info
(bfd *, asymbol *, symbol_info *);
extern bfd_boolean _bfd_elf_is_local_label_name
(bfd *, const char *);
extern alent *_bfd_elf_get_lineno
(bfd *, asymbol *);
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 *);
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
(bfd *, bfd_boolean);
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 *, asection *);
extern void _bfd_elf_no_info_to_howto
(bfd *, arelent *, Elf_Internal_Rela *);
extern bfd_boolean bfd_section_from_shdr
(bfd *, unsigned int shindex);
extern bfd_boolean bfd_section_from_phdr
(bfd *, Elf_Internal_Phdr *, int);
extern int _bfd_elf_symbol_from_bfd_symbol
(bfd *, asymbol **);
extern asection *bfd_section_from_r_symndx
(bfd *, struct sym_sec_cache *, asection *, 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);
extern void _bfd_elf_strtab_free
(struct elf_strtab_hash *);
extern bfd_size_type _bfd_elf_strtab_add
(struct elf_strtab_hash *, const char *, bfd_boolean);
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 void _bfd_elf_strtab_clear_all_refs
(struct elf_strtab_hash *);
extern bfd_size_type _bfd_elf_strtab_size
(struct elf_strtab_hash *);
extern bfd_size_type _bfd_elf_strtab_offset
(struct elf_strtab_hash *, bfd_size_type);
extern bfd_boolean _bfd_elf_strtab_emit
(bfd *, struct elf_strtab_hash *);
extern void _bfd_elf_strtab_finalize
(struct elf_strtab_hash *);
extern bfd_boolean _bfd_elf_discard_section_eh_frame
(bfd *, struct bfd_link_info *, asection *,
bfd_boolean (*) (bfd_vma, void *), struct elf_reloc_cookie *);
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 *, 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
(bfd *, 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_add_default_symbol
(bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
const char *, Elf_Internal_Sym *, asection **, bfd_vma *,
bfd_boolean *, bfd_boolean);
extern bfd_boolean _bfd_elf_export_symbol
(struct elf_link_hash_entry *, void *);
extern bfd_boolean _bfd_elf_link_find_version_dependencies
(struct elf_link_hash_entry *, void *);
extern bfd_boolean _bfd_elf_link_assign_sym_version
(struct elf_link_hash_entry *, void *);
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);
extern bfd_boolean _bfd_elf_validate_reloc
(bfd *, arelent *);
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 bfd_boolean _bfd_elfcore_make_pseudosection
(bfd *, char *, size_t, ufile_ptr);
extern char *_bfd_elfcore_strndup
(bfd *, char *, size_t);
extern Elf_Internal_Rela *_bfd_elf_link_read_relocs
(bfd *, asection *, void *, Elf_Internal_Rela *, bfd_boolean);
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 *,
struct elf_link_hash_entry **);
extern bfd_boolean _bfd_elf_fix_symbol_flags
(struct elf_link_hash_entry *, struct elf_info_failed *);
extern bfd_boolean _bfd_elf_adjust_dynamic_symbol
(struct elf_link_hash_entry *, void *);
extern bfd_boolean _bfd_elf_link_sec_merge_syms
(struct elf_link_hash_entry *, void *);
extern bfd_boolean _bfd_elf_dynamic_symbol_p
(struct elf_link_hash_entry *, struct bfd_link_info *, bfd_boolean);
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_group_pointers
(bfd *);
extern const bfd_target *bfd_elf32_object_p
(bfd *);
extern const bfd_target *bfd_elf32_core_file_p
(bfd *);
extern char *bfd_elf32_core_file_failing_command
(bfd *);
extern int bfd_elf32_core_file_failing_signal
(bfd *);
extern bfd_boolean bfd_elf32_core_file_matches_executable_p
(bfd *, bfd *);
extern void bfd_elf32_swap_symbol_in
(bfd *, const void *, const void *, Elf_Internal_Sym *);
extern void bfd_elf32_swap_symbol_out
(bfd *, const Elf_Internal_Sym *, void *, void *);
extern void bfd_elf32_swap_reloc_in
(bfd *, const bfd_byte *, Elf_Internal_Rela *);
extern void bfd_elf32_swap_reloc_out
(bfd *, const Elf_Internal_Rela *, bfd_byte *);
extern void bfd_elf32_swap_reloca_in
(bfd *, const bfd_byte *, Elf_Internal_Rela *);
extern void bfd_elf32_swap_reloca_out
(bfd *, const Elf_Internal_Rela *, bfd_byte *);
extern void bfd_elf32_swap_phdr_in
(bfd *, const Elf32_External_Phdr *, Elf_Internal_Phdr *);
extern void bfd_elf32_swap_phdr_out
(bfd *, const Elf_Internal_Phdr *, Elf32_External_Phdr *);
extern void bfd_elf32_swap_dyn_in
(bfd *, const void *, Elf_Internal_Dyn *);
extern void bfd_elf32_swap_dyn_out
(bfd *, const Elf_Internal_Dyn *, void *);
extern long bfd_elf32_slurp_symbol_table
(bfd *, asymbol **, bfd_boolean);
extern bfd_boolean bfd_elf32_write_shdrs_and_ehdr
(bfd *);
extern int bfd_elf32_write_out_phdrs
(bfd *, const Elf_Internal_Phdr *, unsigned int);
extern void bfd_elf32_write_relocs
(bfd *, asection *, void *);
extern bfd_boolean bfd_elf32_slurp_reloc_table
(bfd *, asection *, asymbol **, bfd_boolean);
extern const bfd_target *bfd_elf64_object_p
(bfd *);
extern const bfd_target *bfd_elf64_core_file_p
(bfd *);
extern char *bfd_elf64_core_file_failing_command
(bfd *);
extern int bfd_elf64_core_file_failing_signal
(bfd *);
extern bfd_boolean bfd_elf64_core_file_matches_executable_p
(bfd *, bfd *);
extern void bfd_elf64_swap_symbol_in
(bfd *, const void *, const void *, Elf_Internal_Sym *);
extern void bfd_elf64_swap_symbol_out
(bfd *, const Elf_Internal_Sym *, void *, void *);
extern void bfd_elf64_swap_reloc_in
(bfd *, const bfd_byte *, Elf_Internal_Rela *);
extern void bfd_elf64_swap_reloc_out
(bfd *, const Elf_Internal_Rela *, bfd_byte *);
extern void bfd_elf64_swap_reloca_in
(bfd *, const bfd_byte *, Elf_Internal_Rela *);
extern void bfd_elf64_swap_reloca_out
(bfd *, const Elf_Internal_Rela *, bfd_byte *);
extern void bfd_elf64_swap_phdr_in
(bfd *, const Elf64_External_Phdr *, Elf_Internal_Phdr *);
extern void bfd_elf64_swap_phdr_out
(bfd *, const Elf_Internal_Phdr *, Elf64_External_Phdr *);
extern void bfd_elf64_swap_dyn_in
(bfd *, const void *, Elf_Internal_Dyn *);
extern void bfd_elf64_swap_dyn_out
(bfd *, const Elf_Internal_Dyn *, void *);
extern long bfd_elf64_slurp_symbol_table
(bfd *, asymbol **, bfd_boolean);
extern bfd_boolean bfd_elf64_write_shdrs_and_ehdr
(bfd *);
extern int bfd_elf64_write_out_phdrs
(bfd *, const Elf_Internal_Phdr *, unsigned int);
extern void bfd_elf64_write_relocs
(bfd *, asection *, void *);
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
(struct bfd_link_info *, bfd_vma, bfd_vma);
extern bfd_boolean bfd_elf_link_record_dynamic_symbol
(struct bfd_link_info *, struct elf_link_hash_entry *);
extern int bfd_elf_link_record_local_dynamic_symbol
(struct bfd_link_info *, bfd *, long);
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 **);
extern bfd_boolean bfd_elf_final_link
(bfd *, struct bfd_link_info *);
extern bfd_boolean bfd_elf_gc_sections
(bfd *, struct bfd_link_info *);
extern bfd_boolean bfd_elf_gc_record_vtinherit
(bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
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 *);
extern bfd_boolean bfd_elf_gc_common_final_link
(bfd *, struct bfd_link_info *);
extern bfd_boolean bfd_elf_reloc_symbol_deleted_p
(bfd_vma, void *);
extern struct elf_segment_map *
_bfd_elf_make_dynamic_segment
(bfd *, asection *);
extern char *elfcore_write_note
(bfd *, char *, int *, const char *, int, const void *, int);
extern char *elfcore_write_prpsinfo
(bfd *, char *, int *, const char *, const char *);
extern char *elfcore_write_prstatus
(bfd *, char *, int *, long, int, const void *);
extern char * elfcore_write_pstatus
(bfd *, char *, int *, long, int, const void *);
extern char *elfcore_write_prfpreg
(bfd *, char *, int *, const void *, int);
extern char *elfcore_write_prxfpreg
(bfd *, char *, int *, const void *, int);
extern char *elfcore_write_lwpstatus
(bfd *, char *, int *, long, int, const void *);
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));
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));
extern asection _bfd_elf_large_com_section;
extern bfd_boolean _sh_elf_set_mach_from_flags
(bfd *);
#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \
((DYN) \
&& ((SHARED) || !(H)->forced_local) \
&& ((H)->dynindx != -1 || (H)->forced_local))
#define RELOC_FOR_GLOBAL_SYMBOL(info, input_bfd, input_section, rel, \
r_symndx, symtab_hdr, sym_hashes, \
h, sec, relocation, \
unresolved_reloc, warned) \
do \
{ \
\
if (sym_hashes == NULL) \
return FALSE; \
\
h = sym_hashes[r_symndx - symtab_hdr->sh_info]; \
\
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; \
unresolved_reloc = FALSE; \
relocation = 0; \
if (h->root.type == bfd_link_hash_defined \
|| h->root.type == bfd_link_hash_defweak) \
{ \
sec = h->root.u.def.section; \
if (sec == NULL \
|| sec->output_section == NULL) \
\
unresolved_reloc = TRUE; \
else \
relocation = (h->root.u.def.value \
+ sec->output_section->vma \
+ sec->output_offset); \
} \
else if (h->root.type == bfd_link_hash_undefweak) \
; \
else if (info->unresolved_syms_in_objects == RM_IGNORE \
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) \
; \
else \
{ \
bfd_boolean err; \
err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR \
|| ELF_ST_VISIBILITY (h->other) != STV_DEFAULT); \
if (!info->callbacks->undefined_symbol (info, \
h->root.root.string, \
input_bfd, \
input_section, \
rel->r_offset, err)) \
return FALSE; \
warned = TRUE; \
} \
} \
while (0)
#endif