public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: c/5124: gcc fails to compile binutils on alpha
@ 2002-04-26 2:07 rth
0 siblings, 0 replies; 2+ messages in thread
From: rth @ 2002-04-26 2:07 UTC (permalink / raw)
To: dl8bcu, gcc-bugs, gcc-prs, nobody
Synopsis: gcc fails to compile binutils on alpha
State-Changed-From-To: open->closed
State-Changed-By: rth
State-Changed-When: Fri Apr 26 02:07:11 2002
State-Changed-Why:
Fixed for gcc 3.1.
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=5124
^ permalink raw reply [flat|nested] 2+ messages in thread
* c/5124: gcc fails to compile binutils on alpha
@ 2001-12-15 6:06 dl8bcu
0 siblings, 0 replies; 2+ messages in thread
From: dl8bcu @ 2001-12-15 6:06 UTC (permalink / raw)
To: gcc-gnats
>Number: 5124
>Category: c
>Synopsis: gcc fails to compile binutils on alpha
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: unassigned
>State: open
>Class: rejects-legal
>Submitter-Id: net
>Arrival-Date: Sat Dec 15 06:06:01 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: Thorsten Kranzkowski
>Release: 3.1 20011212 (experimental)
>Organization:
>Environment:
System: Linux Marvin 2.5.1-pre1 #4 Tue Nov 27 18:28:06 UTC 2001 alpha unknown
Architecture: alpha
host: alpha-unknown-linux-gnu
build: alpha-unknown-linux-gnu
target: alpha-unknown-linux-gnu
configured with: ../gcc/configure --prefix=/usr --enable-languages=c,c++
Alpha AXPpci33 ev4
>Description:
When compiling binutils 2.11.92.0.12.3 I get this error:
/bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I. -D_GNU_SOURCE -DTRAD_CORE -I. -I. -I./../include -I./../intl -I../intl -W -Wall -Wstrict-prototypes -Wmissing-prototypes -g -O2 -c elf64.c
gcc -DHAVE_CONFIG_H -I. -I. -I. -D_GNU_SOURCE -DTRAD_CORE -I. -I. -I./../include -I./../intl -I../intl -W
-Wall -Wstrict-prototypes -Wmissing-prototypes -g -O2 -c elf64.c -fPIC -DPIC -o .libs/elf64.o
In file included from elfcode.h:1553,
from elf64.c:22:
elflink.h: In function `elf_link_input_bfd':
elflink.h:6849: unable to find a register to spill in class `R27_REG'
elflink.h:6849: this is the insn:
(insn 1986 2858 1992 (parallel[
(set (reg:DI 3 $3 [624])
(udiv:DI (reg:DI 24 $24 [622])
(reg:DI 25 $25 [623])))
(clobber (reg:DI 23 $23))
(clobber (reg:DI 28 $28))
] ) 37 {*divmoddi_internal} (insn_list 1983 (insn_list 1985 (nil)))
(expr_list:REG_DEAD (reg:DI 24 $24 [622])
(expr_list:REG_DEAD (reg:DI 25 $25 [623])
(expr_list:REG_UNUSED (reg:DI 23 $23)
(expr_list:REG_UNUSED (reg:DI 28 $28)
(nil))))))
elflink.h:6849: confused by earlier errors, bailing out
make[3]: *** [elf64.lo] Error 1
make[3]: Leaving directory `/home/th/src/binutils-2.11.92.0.12.3/bfd'
>How-To-Repeat:
compile this (generated by adding -save-temps to above compiler invocation):
# 1 "elf64.c"
# 1 "<builtin>"
# 1 "<command line>"
# 1 "elf64.c"
# 22 "elf64.c"
# 1 "elfcode.h" 1
# 67 "elfcode.h"
# 1 "bfd.h" 1
# 36 "bfd.h"
# 1 "../include/ansidecl.h" 1
# 37 "bfd.h" 2
# 1 "../include/symcat.h" 1
# 38 "bfd.h" 2
# 81 "bfd.h"
typedef struct _bfd bfd;
# 106 "bfd.h"
typedef enum bfd_boolean {false, true} boolean;
# 139 "bfd.h"
typedef unsigned long bfd_vma;
typedef long bfd_signed_vma;
typedef unsigned long bfd_size_type;
typedef unsigned long symvalue;
# 188 "bfd.h"
typedef bfd_signed_vma file_ptr;
typedef bfd_vma ufile_ptr;
extern void bfd_sprintf_vma (bfd *, char *, bfd_vma);
extern void bfd_fprintf_vma (bfd *, void *, bfd_vma);
typedef unsigned int flagword;
typedef unsigned char bfd_byte;
typedef enum bfd_format {
bfd_unknown = 0,
bfd_object,
bfd_archive,
bfd_core,
bfd_type_end}
bfd_format;
# 270 "bfd.h"
typedef unsigned long symindex;
typedef const struct reloc_howto_struct reloc_howto_type;
# 292 "bfd.h"
typedef struct carsym {
char *name;
file_ptr file_offset;
} carsym;
struct orl {
char **name;
union {
file_ptr pos;
bfd *abfd;
} u;
int namidx;
};
typedef struct lineno_cache_entry {
unsigned int line_number;
union {
struct symbol_cache_entry *sym;
bfd_vma offset;
} u;
} alent;
typedef struct sec *sec_ptr;
# 341 "bfd.h"
typedef struct stat stat_type;
typedef enum bfd_print_symbol
{
bfd_print_symbol_name,
bfd_print_symbol_more,
bfd_print_symbol_all
} bfd_print_symbol_type;
typedef struct _symbol_info
{
symvalue value;
char type;
const char *name;
unsigned char stab_type;
char stab_other;
short stab_desc;
const char *stab_name;
} symbol_info;
extern const char *bfd_get_stab_name (int);
struct bfd_hash_entry
{
struct bfd_hash_entry *next;
const char *string;
unsigned long hash;
};
struct bfd_hash_table
{
struct bfd_hash_entry **table;
unsigned int size;
struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
void * memory;
};
extern boolean bfd_hash_table_init
(struct bfd_hash_table *, struct bfd_hash_entry *(*) (struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
extern boolean bfd_hash_table_init_n
(struct bfd_hash_table *, struct bfd_hash_entry *(*) (struct bfd_hash_entry *, struct bfd_hash_table *, const char *), unsigned int size);
extern void bfd_hash_table_free (struct bfd_hash_table *);
extern struct bfd_hash_entry *bfd_hash_lookup
(struct bfd_hash_table *, const char *, boolean create, boolean copy);
extern void bfd_hash_replace
(struct bfd_hash_table *, struct bfd_hash_entry *old, struct bfd_hash_entry *nw);
extern struct bfd_hash_entry *bfd_hash_newfunc
(struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
extern void * bfd_hash_allocate (struct bfd_hash_table *, unsigned int);
extern void bfd_hash_traverse (struct bfd_hash_table *, boolean (*) (struct bfd_hash_entry *, void *), void * info);
# 461 "bfd.h"
extern bfd_size_type bfd_bread (void *, bfd_size_type, bfd *);
extern bfd_size_type bfd_bwrite (const void *, bfd_size_type, bfd *);
extern int bfd_seek (bfd *, file_ptr, int);
extern ufile_ptr bfd_tell (bfd *);
extern int bfd_flush (bfd *);
extern int bfd_stat (bfd *, struct stat *);
# 484 "bfd.h"
extern void warn_deprecated
(const char *, const char *, int, const char *);
# 521 "bfd.h"
extern boolean bfd_cache_close (bfd *abfd);
extern boolean bfd_record_phdr
(bfd *, unsigned long, boolean, flagword, boolean, bfd_vma, boolean, boolean, unsigned int, struct sec **);
bfd_vma bfd_getb64 (const unsigned char *);
bfd_vma bfd_getl64 (const unsigned char *);
bfd_signed_vma bfd_getb_signed_64 (const unsigned char *);
bfd_signed_vma bfd_getl_signed_64 (const unsigned char *);
bfd_vma bfd_getb32 (const unsigned char *);
bfd_vma bfd_getl32 (const unsigned char *);
bfd_signed_vma bfd_getb_signed_32 (const unsigned char *);
bfd_signed_vma bfd_getl_signed_32 (const unsigned char *);
bfd_vma bfd_getb16 (const unsigned char *);
bfd_vma bfd_getl16 (const unsigned char *);
bfd_signed_vma bfd_getb_signed_16 (const unsigned char *);
bfd_signed_vma bfd_getl_signed_16 (const unsigned char *);
void bfd_putb64 (bfd_vma, unsigned char *);
void bfd_putl64 (bfd_vma, unsigned char *);
void bfd_putb32 (bfd_vma, unsigned char *);
void bfd_putl32 (bfd_vma, unsigned char *);
void bfd_putb16 (bfd_vma, unsigned char *);
void bfd_putl16 (bfd_vma, unsigned char *);
bfd_vma bfd_get_bits (bfd_byte *, int, boolean);
void bfd_put_bits (bfd_vma, bfd_byte *, int, boolean);
struct ecoff_debug_info;
struct ecoff_debug_swap;
struct ecoff_extr;
struct symbol_cache_entry;
struct bfd_link_info;
struct bfd_link_hash_entry;
struct bfd_elf_version_tree;
extern bfd_vma bfd_ecoff_get_gp_value (bfd * abfd);
extern boolean bfd_ecoff_set_gp_value (bfd *abfd, bfd_vma gp_value);
extern boolean bfd_ecoff_set_regmasks
(bfd *abfd, unsigned long gprmask, unsigned long fprmask, unsigned long *cprmask);
extern void * bfd_ecoff_debug_init
(bfd *output_bfd, struct ecoff_debug_info *output_debug, const struct ecoff_debug_swap *output_swap, struct bfd_link_info *);
extern void bfd_ecoff_debug_free
(void * handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, const struct ecoff_debug_swap *output_swap, struct bfd_link_info *);
extern boolean bfd_ecoff_debug_accumulate
(void * handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, const struct ecoff_debug_swap *output_swap, bfd *input_bfd, struct ecoff_debug_info *input_debug, const struct ecoff_debug_swap *input_swap, struct bfd_link_info *);
extern boolean bfd_ecoff_debug_accumulate_other
(void * handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, const struct ecoff_debug_swap *output_swap, bfd *input_bfd, struct bfd_link_info *);
extern boolean bfd_ecoff_debug_externals
(bfd *abfd, struct ecoff_debug_info *debug, const struct ecoff_debug_swap *swap, boolean relocateable, boolean (*get_extr) (struct symbol_cache_entry *, struct ecoff_extr *), void (*set_index) (struct symbol_cache_entry *, bfd_size_type));
extern boolean bfd_ecoff_debug_one_external
(bfd *abfd, struct ecoff_debug_info *debug, const struct ecoff_debug_swap *swap, const char *name, struct ecoff_extr *esym);
extern bfd_size_type bfd_ecoff_debug_size
(bfd *abfd, struct ecoff_debug_info *debug, const struct ecoff_debug_swap *swap);
extern boolean bfd_ecoff_write_debug
(bfd *abfd, struct ecoff_debug_info *debug, const struct ecoff_debug_swap *swap, file_ptr where);
extern boolean bfd_ecoff_write_accumulated_debug
(void * handle, bfd *abfd, struct ecoff_debug_info *debug, const struct ecoff_debug_swap *swap, struct bfd_link_info *info, file_ptr where);
extern boolean bfd_mips_ecoff_create_embedded_relocs
(bfd *, struct bfd_link_info *, struct sec *, struct sec *, char **);
struct bfd_link_needed_list
{
struct bfd_link_needed_list *next;
bfd *by;
const char *name;
};
extern boolean bfd_elf32_record_link_assignment
(bfd *, struct bfd_link_info *, const char *, boolean);
extern boolean bfd_elf64_record_link_assignment
(bfd *, struct bfd_link_info *, const char *, boolean);
extern struct bfd_link_needed_list *bfd_elf_get_needed_list
(bfd *, struct bfd_link_info *);
extern boolean bfd_elf_get_bfd_needed_list
(bfd *, struct bfd_link_needed_list **);
extern boolean bfd_elf32_size_dynamic_sections
(bfd *, const char *, const char *, const char *, const char * const *, struct bfd_link_info *, struct sec **, struct bfd_elf_version_tree *);
extern boolean bfd_elf64_size_dynamic_sections
(bfd *, const char *, const char *, const char *, const char * const *, struct bfd_link_info *, struct sec **, struct bfd_elf_version_tree *);
extern void bfd_elf_set_dt_needed_name (bfd *, const char *);
extern void bfd_elf_set_dt_needed_soname (bfd *, const char *);
extern const char *bfd_elf_get_dt_soname (bfd *);
extern struct bfd_link_needed_list *bfd_elf_get_runpath_list
(bfd *, struct bfd_link_info *);
extern boolean bfd_elf32_discard_info
(struct bfd_link_info *);
extern boolean bfd_elf64_discard_info
(struct bfd_link_info *);
extern long bfd_get_elf_phdr_upper_bound (bfd *abfd);
# 661 "bfd.h"
extern int bfd_get_elf_phdrs (bfd *abfd, void *phdrs);
extern int bfd_get_arch_size (bfd *);
extern int bfd_get_sign_extend_vma (bfd *);
extern boolean bfd_m68k_elf32_create_embedded_relocs
(bfd *, struct bfd_link_info *, struct sec *, struct sec *, char **);
extern struct bfd_link_needed_list *bfd_sunos_get_needed_list
(bfd *, struct bfd_link_info *);
extern boolean bfd_sunos_record_link_assignment
(bfd *, struct bfd_link_info *, const char *);
extern boolean bfd_sunos_size_dynamic_sections
(bfd *, struct bfd_link_info *, struct sec **, struct sec **, struct sec **);
extern boolean bfd_i386linux_size_dynamic_sections
(bfd *, struct bfd_link_info *);
extern boolean bfd_m68klinux_size_dynamic_sections
(bfd *, struct bfd_link_info *);
extern boolean bfd_sparclinux_size_dynamic_sections
(bfd *, struct bfd_link_info *);
struct _bfd_window_internal;
typedef struct _bfd_window_internal bfd_window_internal;
typedef struct _bfd_window {
void * data;
bfd_size_type size;
struct _bfd_window_internal *i;
} bfd_window;
extern void bfd_init_window (bfd_window *);
extern void bfd_free_window (bfd_window *);
extern boolean bfd_get_file_window
(bfd *, file_ptr, bfd_size_type, bfd_window *, boolean);
extern boolean bfd_xcoff_link_record_set
(bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, bfd_size_type);
extern boolean bfd_xcoff_import_symbol
(bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, bfd_vma, const char *, const char *, const char *, unsigned int);
extern boolean bfd_xcoff_export_symbol
(bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *);
extern boolean bfd_xcoff_link_count_reloc
(bfd *, struct bfd_link_info *, const char *);
extern boolean bfd_xcoff_record_link_assignment
(bfd *, struct bfd_link_info *, const char *);
extern boolean bfd_xcoff_size_dynamic_sections
(bfd *, struct bfd_link_info *, const char *, const char *, unsigned long, unsigned long, unsigned long, boolean, int, boolean, boolean, struct sec **);
struct internal_syment;
union internal_auxent;
extern boolean bfd_coff_get_syment
(bfd *, struct symbol_cache_entry *, struct internal_syment *);
extern boolean bfd_coff_get_auxent
(bfd *, struct symbol_cache_entry *, int, union internal_auxent *);
extern boolean bfd_coff_set_symbol_class
(bfd *, struct symbol_cache_entry *, unsigned int);
extern boolean bfd_m68k_coff_create_embedded_relocs
(bfd *, struct bfd_link_info *, struct sec *, struct sec *, char **);
extern boolean bfd_arm_allocate_interworking_sections
(struct bfd_link_info *);
extern boolean bfd_arm_process_before_allocation
(bfd *, struct bfd_link_info *, int);
extern boolean bfd_arm_get_bfd_for_interworking
(bfd *, struct bfd_link_info *);
extern boolean bfd_arm_pe_allocate_interworking_sections
(struct bfd_link_info *);
extern boolean bfd_arm_pe_process_before_allocation
(bfd *, struct bfd_link_info *, int);
extern boolean bfd_arm_pe_get_bfd_for_interworking
(bfd *, struct bfd_link_info *);
extern boolean bfd_elf32_arm_allocate_interworking_sections
(struct bfd_link_info *);
extern boolean bfd_elf32_arm_process_before_allocation
(bfd *, struct bfd_link_info *, int);
extern boolean bfd_elf32_arm_get_bfd_for_interworking
(bfd *, struct bfd_link_info *);
extern void bfd_ticoff_set_section_load_page
(struct sec *, int);
extern int bfd_ticoff_get_section_load_page
(struct sec *);
void
bfd_init (void);
bfd *
bfd_openr (const char *filename, const char *target);
bfd *
bfd_fdopenr (const char *filename, const char *target, int fd);
bfd *
bfd_openstreamr (const char *, const char *, void *);
bfd *
bfd_openw (const char *filename, const char *target);
boolean
bfd_close (bfd *abfd);
boolean
bfd_close_all_done (bfd *);
bfd *
bfd_create (const char *filename, bfd *templ);
boolean
bfd_make_writable (bfd *abfd);
boolean
bfd_make_readable (bfd *abfd);
# 967 "bfd.h"
struct bfd_comdat_info
{
const char *name;
long symbol;
};
typedef struct sec
{
const char *name;
int id;
int index;
struct sec *next;
flagword flags;
# 1183 "bfd.h"
unsigned int user_set_vma : 1;
unsigned int reloc_done : 1;
unsigned int linker_mark : 1;
unsigned int linker_has_input : 1;
unsigned int gc_mark : 1;
unsigned int segment_mark : 1;
# 1211 "bfd.h"
bfd_vma vma;
bfd_vma lma;
bfd_size_type _cooked_size;
bfd_size_type _raw_size;
# 1239 "bfd.h"
bfd_vma output_offset;
struct sec *output_section;
unsigned int alignment_power;
struct reloc_cache_entry *relocation;
struct reloc_cache_entry **orelocation;
unsigned reloc_count;
file_ptr filepos;
file_ptr rel_filepos;
file_ptr line_filepos;
void * userdata;
unsigned char *contents;
alent *lineno;
unsigned int lineno_count;
unsigned int entsize;
struct bfd_comdat_info *comdat;
file_ptr moving_line_filepos;
int target_index;
void * used_by_bfd;
struct relent_chain *constructor_chain;
bfd *owner;
struct symbol_cache_entry *symbol;
struct symbol_cache_entry **symbol_ptr_ptr;
struct bfd_link_order *link_order_head;
struct bfd_link_order *link_order_tail;
} asection ;
# 1342 "bfd.h"
extern const asection bfd_abs_section;
extern const asection bfd_und_section;
extern const asection bfd_com_section;
extern const asection bfd_ind_section;
# 1363 "bfd.h"
extern const struct symbol_cache_entry * const bfd_abs_symbol;
extern const struct symbol_cache_entry * const bfd_com_symbol;
extern const struct symbol_cache_entry * const bfd_und_symbol;
extern const struct symbol_cache_entry * const bfd_ind_symbol;
asection *
bfd_get_section_by_name (bfd *abfd, const char *name);
char *
bfd_get_unique_section_name (bfd *abfd, const char *templat, int *count);
asection *
bfd_make_section_old_way (bfd *abfd, const char *name);
asection *
bfd_make_section_anyway (bfd *abfd, const char *name);
asection *
bfd_make_section (bfd *, const char *name);
boolean
bfd_set_section_flags (bfd *abfd, asection *sec, flagword flags);
void
bfd_map_over_sections (bfd *abfd, void (*func) (bfd *abfd, asection *sect, void * obj), void * obj);
boolean
bfd_set_section_size (bfd *abfd, asection *sec, bfd_size_type val);
boolean
bfd_set_section_contents (bfd *abfd, asection *section, void * data, file_ptr offset, bfd_size_type count);
boolean
bfd_get_section_contents (bfd *abfd, asection *section, void * location, file_ptr offset, bfd_size_type count);
boolean
bfd_copy_private_section_data (bfd *ibfd, asection *isec, bfd *obfd, asection *osec);
void
_bfd_strip_section_from_output (struct bfd_link_info *info, asection *section);
enum bfd_architecture
{
bfd_arch_unknown,
bfd_arch_obscure,
bfd_arch_m68k,
# 1440 "bfd.h"
bfd_arch_vax,
bfd_arch_i960,
# 1459 "bfd.h"
bfd_arch_a29k,
bfd_arch_sparc,
# 1476 "bfd.h"
bfd_arch_mips,
# 1497 "bfd.h"
bfd_arch_i386,
bfd_arch_we32k,
bfd_arch_tahoe,
bfd_arch_i860,
bfd_arch_i370,
bfd_arch_romp,
bfd_arch_alliant,
bfd_arch_convex,
bfd_arch_m88k,
bfd_arch_pyramid,
bfd_arch_h8300,
bfd_arch_pdp11,
bfd_arch_powerpc,
# 1535 "bfd.h"
bfd_arch_rs6000,
bfd_arch_hppa,
bfd_arch_d10v,
bfd_arch_d30v,
bfd_arch_m68hc11,
bfd_arch_m68hc12,
bfd_arch_z8k,
bfd_arch_h8500,
bfd_arch_sh,
bfd_arch_alpha,
bfd_arch_arm,
# 1575 "bfd.h"
bfd_arch_ns32k,
bfd_arch_w65,
bfd_arch_tic30,
bfd_arch_tic54x,
bfd_arch_tic80,
bfd_arch_v850,
bfd_arch_arc,
bfd_arch_m32r,
bfd_arch_mn10200,
bfd_arch_mn10300,
bfd_arch_fr30,
bfd_arch_mcore,
bfd_arch_ia64,
bfd_arch_pj,
bfd_arch_avr,
bfd_arch_cris,
bfd_arch_s390,
bfd_arch_openrisc,
bfd_arch_mmix,
bfd_arch_last
};
typedef struct bfd_arch_info
{
int bits_per_word;
int bits_per_address;
int bits_per_byte;
enum bfd_architecture arch;
unsigned long mach;
const char *arch_name;
const char *printable_name;
unsigned int section_align_power;
boolean the_default;
const struct bfd_arch_info * (*compatible)
(const struct bfd_arch_info *a, const struct bfd_arch_info *b);
boolean (*scan) (const struct bfd_arch_info *, const char *);
const struct bfd_arch_info *next;
} bfd_arch_info_type;
const char *
bfd_printable_name (bfd *abfd);
const bfd_arch_info_type *
bfd_scan_arch (const char *string);
const char **
bfd_arch_list (void);
const bfd_arch_info_type *
bfd_arch_get_compatible ( const bfd *abfd, const bfd *bbfd);
void
bfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg);
enum bfd_architecture
bfd_get_arch (bfd *abfd);
unsigned long
bfd_get_mach (bfd *abfd);
unsigned int
bfd_arch_bits_per_byte (bfd *abfd);
unsigned int
bfd_arch_bits_per_address (bfd *abfd);
const bfd_arch_info_type *
bfd_get_arch_info (bfd *abfd);
const bfd_arch_info_type *
bfd_lookup_arch (enum bfd_architecture arch, unsigned long machine);
const char *
bfd_printable_arch_mach (enum bfd_architecture arch, unsigned long machine);
unsigned int
bfd_octets_per_byte (bfd *abfd);
unsigned int
bfd_arch_mach_octets_per_byte (enum bfd_architecture arch, unsigned long machine);
typedef enum bfd_reloc_status
{
bfd_reloc_ok,
bfd_reloc_overflow,
bfd_reloc_outofrange,
bfd_reloc_continue,
bfd_reloc_notsupported,
bfd_reloc_other,
bfd_reloc_undefined,
bfd_reloc_dangerous
}
bfd_reloc_status_type;
typedef struct reloc_cache_entry
{
struct symbol_cache_entry **sym_ptr_ptr;
bfd_size_type address;
bfd_vma addend;
reloc_howto_type *howto;
} arelent;
enum complain_overflow
{
complain_overflow_dont,
complain_overflow_bitfield,
complain_overflow_signed,
complain_overflow_unsigned
};
struct reloc_howto_struct
{
unsigned int type;
unsigned int rightshift;
int size;
unsigned int bitsize;
boolean pc_relative;
unsigned int bitpos;
enum complain_overflow complain_on_overflow;
bfd_reloc_status_type (*special_function)
(bfd *, arelent *, struct symbol_cache_entry *, void *, asection *, bfd *, char **);
char *name;
# 1813 "bfd.h"
boolean partial_inplace;
# 1822 "bfd.h"
bfd_vma src_mask;
bfd_vma dst_mask;
boolean pcrel_offset;
};
# 1862 "bfd.h"
unsigned int
bfd_get_reloc_size (reloc_howto_type *);
typedef struct relent_chain
{
arelent relent;
struct relent_chain *next;
} arelent_chain;
bfd_reloc_status_type
bfd_check_overflow (enum complain_overflow how, unsigned int bitsize, unsigned int rightshift, unsigned int addrsize, bfd_vma relocation);
bfd_reloc_status_type
bfd_perform_relocation (bfd *abfd, arelent *reloc_entry, void * data, asection *input_section, bfd *output_bfd, char **error_message);
bfd_reloc_status_type
bfd_install_relocation (bfd *abfd, arelent *reloc_entry, void * data, bfd_vma data_start, asection *input_section, char **error_message);
enum bfd_reloc_code_real {
_dummy_first_bfd_reloc_code_real,
BFD_RELOC_64,
BFD_RELOC_32,
BFD_RELOC_26,
BFD_RELOC_24,
BFD_RELOC_16,
BFD_RELOC_14,
BFD_RELOC_8,
BFD_RELOC_64_PCREL,
BFD_RELOC_32_PCREL,
BFD_RELOC_24_PCREL,
BFD_RELOC_16_PCREL,
BFD_RELOC_12_PCREL,
BFD_RELOC_8_PCREL,
BFD_RELOC_32_GOT_PCREL,
BFD_RELOC_16_GOT_PCREL,
BFD_RELOC_8_GOT_PCREL,
BFD_RELOC_32_GOTOFF,
BFD_RELOC_16_GOTOFF,
BFD_RELOC_LO16_GOTOFF,
BFD_RELOC_HI16_GOTOFF,
BFD_RELOC_HI16_S_GOTOFF,
BFD_RELOC_8_GOTOFF,
BFD_RELOC_64_PLT_PCREL,
BFD_RELOC_32_PLT_PCREL,
BFD_RELOC_24_PLT_PCREL,
BFD_RELOC_16_PLT_PCREL,
BFD_RELOC_8_PLT_PCREL,
BFD_RELOC_64_PLTOFF,
BFD_RELOC_32_PLTOFF,
BFD_RELOC_16_PLTOFF,
BFD_RELOC_LO16_PLTOFF,
BFD_RELOC_HI16_PLTOFF,
BFD_RELOC_HI16_S_PLTOFF,
BFD_RELOC_8_PLTOFF,
BFD_RELOC_68K_GLOB_DAT,
BFD_RELOC_68K_JMP_SLOT,
BFD_RELOC_68K_RELATIVE,
BFD_RELOC_32_BASEREL,
BFD_RELOC_16_BASEREL,
BFD_RELOC_LO16_BASEREL,
BFD_RELOC_HI16_BASEREL,
BFD_RELOC_HI16_S_BASEREL,
BFD_RELOC_8_BASEREL,
BFD_RELOC_RVA,
BFD_RELOC_8_FFnn,
BFD_RELOC_32_PCREL_S2,
BFD_RELOC_16_PCREL_S2,
BFD_RELOC_23_PCREL_S2,
BFD_RELOC_HI22,
BFD_RELOC_LO10,
BFD_RELOC_GPREL16,
BFD_RELOC_GPREL32,
BFD_RELOC_I960_CALLJ,
BFD_RELOC_NONE,
BFD_RELOC_SPARC_WDISP22,
BFD_RELOC_SPARC22,
BFD_RELOC_SPARC13,
BFD_RELOC_SPARC_GOT10,
BFD_RELOC_SPARC_GOT13,
BFD_RELOC_SPARC_GOT22,
BFD_RELOC_SPARC_PC10,
BFD_RELOC_SPARC_PC22,
BFD_RELOC_SPARC_WPLT30,
BFD_RELOC_SPARC_COPY,
BFD_RELOC_SPARC_GLOB_DAT,
BFD_RELOC_SPARC_JMP_SLOT,
BFD_RELOC_SPARC_RELATIVE,
BFD_RELOC_SPARC_UA16,
BFD_RELOC_SPARC_UA32,
BFD_RELOC_SPARC_UA64,
BFD_RELOC_SPARC_BASE13,
BFD_RELOC_SPARC_BASE22,
BFD_RELOC_SPARC_10,
BFD_RELOC_SPARC_11,
BFD_RELOC_SPARC_OLO10,
BFD_RELOC_SPARC_HH22,
BFD_RELOC_SPARC_HM10,
BFD_RELOC_SPARC_LM22,
BFD_RELOC_SPARC_PC_HH22,
BFD_RELOC_SPARC_PC_HM10,
BFD_RELOC_SPARC_PC_LM22,
BFD_RELOC_SPARC_WDISP16,
BFD_RELOC_SPARC_WDISP19,
BFD_RELOC_SPARC_7,
BFD_RELOC_SPARC_6,
BFD_RELOC_SPARC_5,
BFD_RELOC_SPARC_PLT64,
BFD_RELOC_SPARC_HIX22,
BFD_RELOC_SPARC_LOX10,
BFD_RELOC_SPARC_H44,
BFD_RELOC_SPARC_M44,
BFD_RELOC_SPARC_L44,
BFD_RELOC_SPARC_REGISTER,
BFD_RELOC_SPARC_REV32,
BFD_RELOC_ALPHA_GPDISP_HI16,
BFD_RELOC_ALPHA_GPDISP_LO16,
BFD_RELOC_ALPHA_GPDISP,
# 2076 "bfd.h"
BFD_RELOC_ALPHA_LITERAL,
BFD_RELOC_ALPHA_ELF_LITERAL,
BFD_RELOC_ALPHA_LITUSE,
BFD_RELOC_ALPHA_HINT,
BFD_RELOC_ALPHA_LINKAGE,
BFD_RELOC_ALPHA_CODEADDR,
BFD_RELOC_ALPHA_GPREL_HI16,
BFD_RELOC_ALPHA_GPREL_LO16,
BFD_RELOC_MIPS_JMP,
BFD_RELOC_MIPS16_JMP,
BFD_RELOC_MIPS16_GPREL,
BFD_RELOC_HI16,
BFD_RELOC_HI16_S,
BFD_RELOC_LO16,
BFD_RELOC_PCREL_HI16_S,
BFD_RELOC_PCREL_LO16,
BFD_RELOC_MIPS_LITERAL,
BFD_RELOC_MIPS_GOT16,
BFD_RELOC_MIPS_CALL16,
BFD_RELOC_MIPS_GOT_HI16,
BFD_RELOC_MIPS_GOT_LO16,
BFD_RELOC_MIPS_CALL_HI16,
BFD_RELOC_MIPS_CALL_LO16,
BFD_RELOC_MIPS_SUB,
BFD_RELOC_MIPS_GOT_PAGE,
BFD_RELOC_MIPS_GOT_OFST,
BFD_RELOC_MIPS_GOT_DISP,
BFD_RELOC_MIPS_SHIFT5,
BFD_RELOC_MIPS_SHIFT6,
BFD_RELOC_MIPS_INSERT_A,
BFD_RELOC_MIPS_INSERT_B,
BFD_RELOC_MIPS_DELETE,
BFD_RELOC_MIPS_HIGHEST,
BFD_RELOC_MIPS_HIGHER,
BFD_RELOC_MIPS_SCN_DISP,
BFD_RELOC_MIPS_REL16,
BFD_RELOC_MIPS_RELGOT,
BFD_RELOC_MIPS_JALR,
BFD_RELOC_386_GOT32,
BFD_RELOC_386_PLT32,
BFD_RELOC_386_COPY,
BFD_RELOC_386_GLOB_DAT,
BFD_RELOC_386_JUMP_SLOT,
BFD_RELOC_386_RELATIVE,
BFD_RELOC_386_GOTOFF,
BFD_RELOC_386_GOTPC,
BFD_RELOC_X86_64_GOT32,
BFD_RELOC_X86_64_PLT32,
BFD_RELOC_X86_64_COPY,
BFD_RELOC_X86_64_GLOB_DAT,
BFD_RELOC_X86_64_JUMP_SLOT,
BFD_RELOC_X86_64_RELATIVE,
BFD_RELOC_X86_64_GOTPCREL,
BFD_RELOC_X86_64_32S,
BFD_RELOC_NS32K_IMM_8,
BFD_RELOC_NS32K_IMM_16,
BFD_RELOC_NS32K_IMM_32,
BFD_RELOC_NS32K_IMM_8_PCREL,
BFD_RELOC_NS32K_IMM_16_PCREL,
BFD_RELOC_NS32K_IMM_32_PCREL,
BFD_RELOC_NS32K_DISP_8,
BFD_RELOC_NS32K_DISP_16,
BFD_RELOC_NS32K_DISP_32,
BFD_RELOC_NS32K_DISP_8_PCREL,
BFD_RELOC_NS32K_DISP_16_PCREL,
BFD_RELOC_NS32K_DISP_32_PCREL,
BFD_RELOC_PDP11_DISP_8_PCREL,
BFD_RELOC_PDP11_DISP_6_PCREL,
BFD_RELOC_PJ_CODE_HI16,
BFD_RELOC_PJ_CODE_LO16,
BFD_RELOC_PJ_CODE_DIR16,
BFD_RELOC_PJ_CODE_DIR32,
BFD_RELOC_PJ_CODE_REL16,
BFD_RELOC_PJ_CODE_REL32,
BFD_RELOC_PPC_B26,
BFD_RELOC_PPC_BA26,
BFD_RELOC_PPC_TOC16,
BFD_RELOC_PPC_B16,
BFD_RELOC_PPC_B16_BRTAKEN,
BFD_RELOC_PPC_B16_BRNTAKEN,
BFD_RELOC_PPC_BA16,
BFD_RELOC_PPC_BA16_BRTAKEN,
BFD_RELOC_PPC_BA16_BRNTAKEN,
BFD_RELOC_PPC_COPY,
BFD_RELOC_PPC_GLOB_DAT,
BFD_RELOC_PPC_JMP_SLOT,
BFD_RELOC_PPC_RELATIVE,
BFD_RELOC_PPC_LOCAL24PC,
BFD_RELOC_PPC_EMB_NADDR32,
BFD_RELOC_PPC_EMB_NADDR16,
BFD_RELOC_PPC_EMB_NADDR16_LO,
BFD_RELOC_PPC_EMB_NADDR16_HI,
BFD_RELOC_PPC_EMB_NADDR16_HA,
BFD_RELOC_PPC_EMB_SDAI16,
BFD_RELOC_PPC_EMB_SDA2I16,
BFD_RELOC_PPC_EMB_SDA2REL,
BFD_RELOC_PPC_EMB_SDA21,
BFD_RELOC_PPC_EMB_MRKREF,
BFD_RELOC_PPC_EMB_RELSEC16,
BFD_RELOC_PPC_EMB_RELST_LO,
BFD_RELOC_PPC_EMB_RELST_HI,
BFD_RELOC_PPC_EMB_RELST_HA,
BFD_RELOC_PPC_EMB_BIT_FLD,
BFD_RELOC_PPC_EMB_RELSDA,
BFD_RELOC_PPC64_HIGHER,
BFD_RELOC_PPC64_HIGHER_S,
BFD_RELOC_PPC64_HIGHEST,
BFD_RELOC_PPC64_HIGHEST_S,
BFD_RELOC_PPC64_TOC16_LO,
BFD_RELOC_PPC64_TOC16_HI,
BFD_RELOC_PPC64_TOC16_HA,
BFD_RELOC_PPC64_TOC,
BFD_RELOC_PPC64_PLTGOT16,
BFD_RELOC_PPC64_PLTGOT16_LO,
BFD_RELOC_PPC64_PLTGOT16_HI,
BFD_RELOC_PPC64_PLTGOT16_HA,
BFD_RELOC_PPC64_ADDR16_DS,
BFD_RELOC_PPC64_ADDR16_LO_DS,
BFD_RELOC_PPC64_GOT16_DS,
BFD_RELOC_PPC64_GOT16_LO_DS,
BFD_RELOC_PPC64_PLT16_LO_DS,
BFD_RELOC_PPC64_SECTOFF_DS,
BFD_RELOC_PPC64_SECTOFF_LO_DS,
BFD_RELOC_PPC64_TOC16_DS,
BFD_RELOC_PPC64_TOC16_LO_DS,
BFD_RELOC_PPC64_PLTGOT16_DS,
BFD_RELOC_PPC64_PLTGOT16_LO_DS,
BFD_RELOC_I370_D12,
BFD_RELOC_CTOR,
BFD_RELOC_ARM_PCREL_BRANCH,
BFD_RELOC_ARM_PCREL_BLX,
BFD_RELOC_THUMB_PCREL_BLX,
BFD_RELOC_ARM_IMMEDIATE,
BFD_RELOC_ARM_ADRL_IMMEDIATE,
BFD_RELOC_ARM_OFFSET_IMM,
BFD_RELOC_ARM_SHIFT_IMM,
BFD_RELOC_ARM_SWI,
BFD_RELOC_ARM_MULTI,
BFD_RELOC_ARM_CP_OFF_IMM,
BFD_RELOC_ARM_ADR_IMM,
BFD_RELOC_ARM_LDR_IMM,
BFD_RELOC_ARM_LITERAL,
BFD_RELOC_ARM_IN_POOL,
BFD_RELOC_ARM_OFFSET_IMM8,
BFD_RELOC_ARM_HWLITERAL,
BFD_RELOC_ARM_THUMB_ADD,
BFD_RELOC_ARM_THUMB_IMM,
BFD_RELOC_ARM_THUMB_SHIFT,
BFD_RELOC_ARM_THUMB_OFFSET,
BFD_RELOC_ARM_GOT12,
BFD_RELOC_ARM_GOT32,
BFD_RELOC_ARM_JUMP_SLOT,
BFD_RELOC_ARM_COPY,
BFD_RELOC_ARM_GLOB_DAT,
BFD_RELOC_ARM_PLT32,
BFD_RELOC_ARM_RELATIVE,
BFD_RELOC_ARM_GOTOFF,
BFD_RELOC_ARM_GOTPC,
BFD_RELOC_SH_PCDISP8BY2,
BFD_RELOC_SH_PCDISP12BY2,
BFD_RELOC_SH_IMM4,
BFD_RELOC_SH_IMM4BY2,
BFD_RELOC_SH_IMM4BY4,
BFD_RELOC_SH_IMM8,
BFD_RELOC_SH_IMM8BY2,
BFD_RELOC_SH_IMM8BY4,
BFD_RELOC_SH_PCRELIMM8BY2,
BFD_RELOC_SH_PCRELIMM8BY4,
BFD_RELOC_SH_SWITCH16,
BFD_RELOC_SH_SWITCH32,
BFD_RELOC_SH_USES,
BFD_RELOC_SH_COUNT,
BFD_RELOC_SH_ALIGN,
BFD_RELOC_SH_CODE,
BFD_RELOC_SH_DATA,
BFD_RELOC_SH_LABEL,
BFD_RELOC_SH_LOOP_START,
BFD_RELOC_SH_LOOP_END,
BFD_RELOC_SH_COPY,
BFD_RELOC_SH_GLOB_DAT,
BFD_RELOC_SH_JMP_SLOT,
BFD_RELOC_SH_RELATIVE,
BFD_RELOC_SH_GOTPC,
BFD_RELOC_THUMB_PCREL_BRANCH9,
BFD_RELOC_THUMB_PCREL_BRANCH12,
BFD_RELOC_THUMB_PCREL_BRANCH23,
BFD_RELOC_ARC_B22_PCREL,
BFD_RELOC_ARC_B26,
BFD_RELOC_D10V_10_PCREL_R,
BFD_RELOC_D10V_10_PCREL_L,
BFD_RELOC_D10V_18,
BFD_RELOC_D10V_18_PCREL,
BFD_RELOC_D30V_6,
BFD_RELOC_D30V_9_PCREL,
BFD_RELOC_D30V_9_PCREL_R,
BFD_RELOC_D30V_15,
BFD_RELOC_D30V_15_PCREL,
BFD_RELOC_D30V_15_PCREL_R,
BFD_RELOC_D30V_21,
BFD_RELOC_D30V_21_PCREL,
BFD_RELOC_D30V_21_PCREL_R,
BFD_RELOC_D30V_32,
BFD_RELOC_D30V_32_PCREL,
BFD_RELOC_M32R_24,
BFD_RELOC_M32R_10_PCREL,
BFD_RELOC_M32R_18_PCREL,
BFD_RELOC_M32R_26_PCREL,
BFD_RELOC_M32R_HI16_ULO,
BFD_RELOC_M32R_HI16_SLO,
BFD_RELOC_M32R_LO16,
BFD_RELOC_M32R_SDA16,
BFD_RELOC_V850_9_PCREL,
BFD_RELOC_V850_22_PCREL,
BFD_RELOC_V850_SDA_16_16_OFFSET,
BFD_RELOC_V850_SDA_15_16_OFFSET,
BFD_RELOC_V850_ZDA_16_16_OFFSET,
BFD_RELOC_V850_ZDA_15_16_OFFSET,
BFD_RELOC_V850_TDA_6_8_OFFSET,
BFD_RELOC_V850_TDA_7_8_OFFSET,
BFD_RELOC_V850_TDA_7_7_OFFSET,
BFD_RELOC_V850_TDA_16_16_OFFSET,
BFD_RELOC_V850_TDA_4_5_OFFSET,
BFD_RELOC_V850_TDA_4_4_OFFSET,
BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET,
BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET,
BFD_RELOC_V850_CALLT_6_7_OFFSET,
BFD_RELOC_V850_CALLT_16_16_OFFSET,
BFD_RELOC_MN10300_32_PCREL,
BFD_RELOC_MN10300_16_PCREL,
BFD_RELOC_TIC30_LDP,
BFD_RELOC_TIC54X_PARTLS7,
BFD_RELOC_TIC54X_PARTMS9,
BFD_RELOC_TIC54X_23,
BFD_RELOC_TIC54X_16_OF_23,
BFD_RELOC_TIC54X_MS7_OF_23,
BFD_RELOC_FR30_48,
BFD_RELOC_FR30_20,
BFD_RELOC_FR30_6_IN_4,
BFD_RELOC_FR30_8_IN_8,
BFD_RELOC_FR30_9_IN_8,
BFD_RELOC_FR30_10_IN_8,
BFD_RELOC_FR30_9_PCREL,
BFD_RELOC_FR30_12_PCREL,
BFD_RELOC_MCORE_PCREL_IMM8BY4,
BFD_RELOC_MCORE_PCREL_IMM11BY2,
BFD_RELOC_MCORE_PCREL_IMM4BY2,
BFD_RELOC_MCORE_PCREL_32,
BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2,
BFD_RELOC_MCORE_RVA,
BFD_RELOC_MMIX_GETA,
BFD_RELOC_MMIX_GETA_1,
BFD_RELOC_MMIX_GETA_2,
BFD_RELOC_MMIX_GETA_3,
BFD_RELOC_MMIX_CBRANCH,
BFD_RELOC_MMIX_CBRANCH_J,
BFD_RELOC_MMIX_CBRANCH_1,
BFD_RELOC_MMIX_CBRANCH_2,
BFD_RELOC_MMIX_CBRANCH_3,
BFD_RELOC_MMIX_PUSHJ,
BFD_RELOC_MMIX_PUSHJ_1,
BFD_RELOC_MMIX_PUSHJ_2,
BFD_RELOC_MMIX_PUSHJ_3,
BFD_RELOC_MMIX_JMP,
BFD_RELOC_MMIX_JMP_1,
BFD_RELOC_MMIX_JMP_2,
BFD_RELOC_MMIX_JMP_3,
BFD_RELOC_MMIX_ADDR19,
BFD_RELOC_MMIX_ADDR27,
BFD_RELOC_MMIX_REG_OR_BYTE,
BFD_RELOC_MMIX_REG,
BFD_RELOC_MMIX_BASE_PLUS_OFFSET,
BFD_RELOC_MMIX_LOCAL,
BFD_RELOC_AVR_7_PCREL,
BFD_RELOC_AVR_13_PCREL,
BFD_RELOC_AVR_16_PM,
BFD_RELOC_AVR_LO8_LDI,
BFD_RELOC_AVR_HI8_LDI,
BFD_RELOC_AVR_HH8_LDI,
BFD_RELOC_AVR_LO8_LDI_NEG,
BFD_RELOC_AVR_HI8_LDI_NEG,
BFD_RELOC_AVR_HH8_LDI_NEG,
BFD_RELOC_AVR_LO8_LDI_PM,
BFD_RELOC_AVR_HI8_LDI_PM,
BFD_RELOC_AVR_HH8_LDI_PM,
BFD_RELOC_AVR_LO8_LDI_PM_NEG,
BFD_RELOC_AVR_HI8_LDI_PM_NEG,
BFD_RELOC_AVR_HH8_LDI_PM_NEG,
BFD_RELOC_AVR_CALL,
BFD_RELOC_390_12,
BFD_RELOC_390_GOT12,
BFD_RELOC_390_PLT32,
BFD_RELOC_390_COPY,
BFD_RELOC_390_GLOB_DAT,
BFD_RELOC_390_JMP_SLOT,
BFD_RELOC_390_RELATIVE,
BFD_RELOC_390_GOTPC,
BFD_RELOC_390_GOT16,
BFD_RELOC_390_PC16DBL,
BFD_RELOC_390_PLT16DBL,
BFD_RELOC_390_PC32DBL,
BFD_RELOC_390_PLT32DBL,
BFD_RELOC_390_GOTPCDBL,
BFD_RELOC_390_GOT64,
BFD_RELOC_390_PLT64,
BFD_RELOC_390_GOTENT,
# 2764 "bfd.h"
BFD_RELOC_VTABLE_INHERIT,
BFD_RELOC_VTABLE_ENTRY,
BFD_RELOC_IA64_IMM14,
BFD_RELOC_IA64_IMM22,
BFD_RELOC_IA64_IMM64,
BFD_RELOC_IA64_DIR32MSB,
BFD_RELOC_IA64_DIR32LSB,
BFD_RELOC_IA64_DIR64MSB,
BFD_RELOC_IA64_DIR64LSB,
BFD_RELOC_IA64_GPREL22,
BFD_RELOC_IA64_GPREL64I,
BFD_RELOC_IA64_GPREL32MSB,
BFD_RELOC_IA64_GPREL32LSB,
BFD_RELOC_IA64_GPREL64MSB,
BFD_RELOC_IA64_GPREL64LSB,
BFD_RELOC_IA64_LTOFF22,
BFD_RELOC_IA64_LTOFF64I,
BFD_RELOC_IA64_PLTOFF22,
BFD_RELOC_IA64_PLTOFF64I,
BFD_RELOC_IA64_PLTOFF64MSB,
BFD_RELOC_IA64_PLTOFF64LSB,
BFD_RELOC_IA64_FPTR64I,
BFD_RELOC_IA64_FPTR32MSB,
BFD_RELOC_IA64_FPTR32LSB,
BFD_RELOC_IA64_FPTR64MSB,
BFD_RELOC_IA64_FPTR64LSB,
BFD_RELOC_IA64_PCREL21B,
BFD_RELOC_IA64_PCREL21BI,
BFD_RELOC_IA64_PCREL21M,
BFD_RELOC_IA64_PCREL21F,
BFD_RELOC_IA64_PCREL22,
BFD_RELOC_IA64_PCREL60B,
BFD_RELOC_IA64_PCREL64I,
BFD_RELOC_IA64_PCREL32MSB,
BFD_RELOC_IA64_PCREL32LSB,
BFD_RELOC_IA64_PCREL64MSB,
BFD_RELOC_IA64_PCREL64LSB,
BFD_RELOC_IA64_LTOFF_FPTR22,
BFD_RELOC_IA64_LTOFF_FPTR64I,
BFD_RELOC_IA64_LTOFF_FPTR32MSB,
BFD_RELOC_IA64_LTOFF_FPTR32LSB,
BFD_RELOC_IA64_LTOFF_FPTR64MSB,
BFD_RELOC_IA64_LTOFF_FPTR64LSB,
BFD_RELOC_IA64_SEGREL32MSB,
BFD_RELOC_IA64_SEGREL32LSB,
BFD_RELOC_IA64_SEGREL64MSB,
BFD_RELOC_IA64_SEGREL64LSB,
BFD_RELOC_IA64_SECREL32MSB,
BFD_RELOC_IA64_SECREL32LSB,
BFD_RELOC_IA64_SECREL64MSB,
BFD_RELOC_IA64_SECREL64LSB,
BFD_RELOC_IA64_REL32MSB,
BFD_RELOC_IA64_REL32LSB,
BFD_RELOC_IA64_REL64MSB,
BFD_RELOC_IA64_REL64LSB,
BFD_RELOC_IA64_LTV32MSB,
BFD_RELOC_IA64_LTV32LSB,
BFD_RELOC_IA64_LTV64MSB,
BFD_RELOC_IA64_LTV64LSB,
BFD_RELOC_IA64_IPLTMSB,
BFD_RELOC_IA64_IPLTLSB,
BFD_RELOC_IA64_COPY,
BFD_RELOC_IA64_TPREL22,
BFD_RELOC_IA64_TPREL64MSB,
BFD_RELOC_IA64_TPREL64LSB,
BFD_RELOC_IA64_LTOFF_TP22,
BFD_RELOC_IA64_LTOFF22X,
BFD_RELOC_IA64_LDXMOV,
BFD_RELOC_M68HC11_HI8,
BFD_RELOC_M68HC11_LO8,
BFD_RELOC_M68HC11_3B,
BFD_RELOC_CRIS_BDISP8,
BFD_RELOC_CRIS_UNSIGNED_5,
BFD_RELOC_CRIS_SIGNED_6,
BFD_RELOC_CRIS_UNSIGNED_6,
BFD_RELOC_CRIS_UNSIGNED_4,
BFD_RELOC_CRIS_COPY,
BFD_RELOC_CRIS_GLOB_DAT,
BFD_RELOC_CRIS_JUMP_SLOT,
BFD_RELOC_CRIS_RELATIVE,
BFD_RELOC_CRIS_32_GOT,
BFD_RELOC_CRIS_16_GOT,
BFD_RELOC_CRIS_32_GOTPLT,
BFD_RELOC_CRIS_16_GOTPLT,
BFD_RELOC_CRIS_32_GOTREL,
BFD_RELOC_CRIS_32_PLT_GOTREL,
BFD_RELOC_CRIS_32_PLT_PCREL,
BFD_RELOC_860_COPY,
BFD_RELOC_860_GLOB_DAT,
BFD_RELOC_860_JUMP_SLOT,
BFD_RELOC_860_RELATIVE,
BFD_RELOC_860_PC26,
BFD_RELOC_860_PLT26,
BFD_RELOC_860_PC16,
BFD_RELOC_860_LOW0,
BFD_RELOC_860_SPLIT0,
BFD_RELOC_860_LOW1,
BFD_RELOC_860_SPLIT1,
BFD_RELOC_860_LOW2,
BFD_RELOC_860_SPLIT2,
BFD_RELOC_860_LOW3,
BFD_RELOC_860_LOGOT0,
BFD_RELOC_860_SPGOT0,
BFD_RELOC_860_LOGOT1,
BFD_RELOC_860_SPGOT1,
BFD_RELOC_860_LOGOTOFF0,
BFD_RELOC_860_SPGOTOFF0,
BFD_RELOC_860_LOGOTOFF1,
BFD_RELOC_860_SPGOTOFF1,
BFD_RELOC_860_LOGOTOFF2,
BFD_RELOC_860_LOGOTOFF3,
BFD_RELOC_860_LOPC,
BFD_RELOC_860_HIGHADJ,
BFD_RELOC_860_HAGOT,
BFD_RELOC_860_HAGOTOFF,
BFD_RELOC_860_HAPC,
BFD_RELOC_860_HIGH,
BFD_RELOC_860_HIGOT,
BFD_RELOC_860_HIGOTOFF,
BFD_RELOC_OPENRISC_ABS_26,
BFD_RELOC_OPENRISC_REL_26,
BFD_RELOC_H8_DIR16A8,
BFD_RELOC_H8_DIR16R8,
BFD_RELOC_H8_DIR24A8,
BFD_RELOC_H8_DIR24R8,
BFD_RELOC_H8_DIR32A16,
BFD_RELOC_UNUSED };
typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
reloc_howto_type *
bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code);
const char *
bfd_get_reloc_code_name (bfd_reloc_code_real_type code);
typedef struct symbol_cache_entry
{
# 2947 "bfd.h"
struct _bfd *the_bfd;
const char *name;
symvalue value;
# 3042 "bfd.h"
flagword flags;
struct sec *section;
union
{
void * p;
bfd_vma i;
} udata;
} asymbol;
boolean
bfd_is_local_label (bfd *abfd, asymbol *sym);
boolean
bfd_is_local_label_name (bfd *abfd, const char *name);
boolean
bfd_set_symtab (bfd *abfd, asymbol **location, unsigned int count);
void
bfd_print_symbol_vandf (bfd *abfd, void * file, asymbol *symbol);
int
bfd_decode_symclass (asymbol *symbol);
boolean
bfd_is_undefined_symclass (int symclass);
void
bfd_symbol_info (asymbol *symbol, symbol_info *ret);
boolean
bfd_copy_private_symbol_data (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym);
struct _bfd
{
const char *filename;
const struct bfd_target *xvec;
# 3110 "bfd.h"
void * iostream;
boolean cacheable;
boolean target_defaulted;
struct _bfd *lru_prev, *lru_next;
ufile_ptr where;
boolean opened_once;
boolean mtime_set;
long mtime;
int ifd;
bfd_format format;
enum bfd_direction {no_direction = 0,
read_direction = 1,
write_direction = 2,
both_direction = 3} direction;
flagword flags;
ufile_ptr origin;
boolean output_has_begun;
struct sec *sections;
unsigned int section_count;
bfd_vma start_address;
unsigned int symcount;
struct symbol_cache_entry **outsymbols;
const struct bfd_arch_info *arch_info;
void * arelt_data;
struct _bfd *my_archive;
struct _bfd *next;
struct _bfd *archive_head;
boolean has_armap;
struct _bfd *link_next;
int archive_pass;
union
{
struct aout_data_struct *aout_data;
struct artdata *aout_ar_data;
struct _oasys_data *oasys_obj_data;
struct _oasys_ar_data *oasys_ar_data;
struct coff_tdata *coff_obj_data;
struct pe_tdata *pe_obj_data;
struct xcoff_tdata *xcoff_obj_data;
struct ecoff_tdata *ecoff_obj_data;
struct ieee_data_struct *ieee_data;
struct ieee_ar_data_struct *ieee_ar_data;
struct srec_data_struct *srec_data;
struct ihex_data_struct *ihex_data;
struct tekhex_data_struct *tekhex_data;
struct elf_obj_tdata *elf_obj_data;
struct nlm_obj_tdata *nlm_obj_data;
struct bout_data_struct *bout_data;
struct mmo_data_struct *mmo_data;
struct sun_core_struct *sun_core_data;
struct sco5_core_struct *sco5_core_data;
struct trad_core_struct *trad_core_data;
struct som_data_struct *som_data;
struct hpux_core_struct *hpux_core_data;
struct hppabsd_core_struct *hppabsd_core_data;
struct sgi_core_struct *sgi_core_data;
struct lynx_core_struct *lynx_core_data;
struct osf_core_struct *osf_core_data;
struct cisco_core_struct *cisco_core_data;
struct versados_data_struct *versados_data;
struct netbsd_core_struct *netbsd_core_data;
void * any;
} tdata;
void * usrdata;
void * memory;
};
typedef enum bfd_error
{
bfd_error_no_error = 0,
bfd_error_system_call,
bfd_error_invalid_target,
bfd_error_wrong_format,
bfd_error_wrong_object_format,
bfd_error_invalid_operation,
bfd_error_no_memory,
bfd_error_no_symbols,
bfd_error_no_armap,
bfd_error_no_more_archived_files,
bfd_error_malformed_archive,
bfd_error_file_not_recognized,
bfd_error_file_ambiguously_recognized,
bfd_error_no_contents,
bfd_error_nonrepresentable_section,
bfd_error_no_debug_section,
bfd_error_bad_value,
bfd_error_file_truncated,
bfd_error_file_too_big,
bfd_error_invalid_error_code
} bfd_error_type;
bfd_error_type
bfd_get_error (void);
void
bfd_set_error (bfd_error_type error_tag);
const char *
bfd_errmsg (bfd_error_type error_tag);
void
bfd_perror (const char *message);
typedef void (*bfd_error_handler_type) (const char *, ...);
bfd_error_handler_type
bfd_set_error_handler (bfd_error_handler_type);
void
bfd_set_error_program_name (const char *);
bfd_error_handler_type
bfd_get_error_handler (void);
const char *
bfd_archive_filename (bfd *);
long
bfd_get_reloc_upper_bound (bfd *abfd, asection *sect);
long
bfd_canonicalize_reloc (bfd *abfd, asection *sec, arelent **loc, asymbol **syms);
void
bfd_set_reloc (bfd *abfd, asection *sec, arelent **rel, unsigned int count);
boolean
bfd_set_file_flags (bfd *abfd, flagword flags);
int
bfd_get_arch_size (bfd *abfd);
int
bfd_get_sign_extend_vma (bfd *abfd);
boolean
bfd_set_start_address (bfd *abfd, bfd_vma vma);
long
bfd_get_mtime (bfd *abfd);
long
bfd_get_size (bfd *abfd);
unsigned int
bfd_get_gp_size (bfd *abfd);
void
bfd_set_gp_size (bfd *abfd, unsigned int i);
bfd_vma
bfd_scan_vma (const char *string, const char **end, int base);
boolean
bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd);
boolean
bfd_merge_private_bfd_data (bfd *ibfd, bfd *obfd);
boolean
bfd_set_private_flags (bfd *abfd, flagword flags);
# 3424 "bfd.h"
extern bfd_byte *bfd_get_relocated_section_contents
(bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *, boolean, asymbol **);
boolean
bfd_alt_mach_code (bfd *abfd, int index);
symindex
bfd_get_next_mapent (bfd *abfd, symindex previous, carsym **sym);
boolean
bfd_set_archive_head (bfd *output, bfd *new_head);
bfd *
bfd_openr_next_archived_file (bfd *archive, bfd *previous);
const char *
bfd_core_file_failing_command (bfd *abfd);
int
bfd_core_file_failing_signal (bfd *abfd);
boolean
core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd);
# 3470 "bfd.h"
enum bfd_flavour {
bfd_target_unknown_flavour,
bfd_target_aout_flavour,
bfd_target_coff_flavour,
bfd_target_ecoff_flavour,
bfd_target_xcoff_flavour,
bfd_target_elf_flavour,
bfd_target_ieee_flavour,
bfd_target_nlm_flavour,
bfd_target_oasys_flavour,
bfd_target_tekhex_flavour,
bfd_target_srec_flavour,
bfd_target_ihex_flavour,
bfd_target_som_flavour,
bfd_target_os9k_flavour,
bfd_target_versados_flavour,
bfd_target_msdos_flavour,
bfd_target_ovax_flavour,
bfd_target_evax_flavour,
bfd_target_mmo_flavour
};
enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN };
typedef struct bfd_link_info _bfd_link_info;
typedef struct bfd_target
{
char *name;
enum bfd_flavour flavour;
enum bfd_endian byteorder;
enum bfd_endian header_byteorder;
flagword object_flags;
flagword section_flags;
char symbol_leading_char;
char ar_pad_char;
unsigned short ar_max_namelen;
bfd_vma (*bfd_getx64) (const bfd_byte *);
bfd_signed_vma (*bfd_getx_signed_64) (const bfd_byte *);
void (*bfd_putx64) (bfd_vma, bfd_byte *);
bfd_vma (*bfd_getx32) (const bfd_byte *);
bfd_signed_vma (*bfd_getx_signed_32) (const bfd_byte *);
void (*bfd_putx32) (bfd_vma, bfd_byte *);
bfd_vma (*bfd_getx16) (const bfd_byte *);
bfd_signed_vma (*bfd_getx_signed_16) (const bfd_byte *);
void (*bfd_putx16) (bfd_vma, bfd_byte *);
bfd_vma (*bfd_h_getx64) (const bfd_byte *);
bfd_signed_vma (*bfd_h_getx_signed_64) (const bfd_byte *);
void (*bfd_h_putx64) (bfd_vma, bfd_byte *);
bfd_vma (*bfd_h_getx32) (const bfd_byte *);
bfd_signed_vma (*bfd_h_getx_signed_32) (const bfd_byte *);
void (*bfd_h_putx32) (bfd_vma, bfd_byte *);
bfd_vma (*bfd_h_getx16) (const bfd_byte *);
bfd_signed_vma (*bfd_h_getx_signed_16) (const bfd_byte *);
void (*bfd_h_putx16) (bfd_vma, bfd_byte *);
const struct bfd_target *(*_bfd_check_format[bfd_type_end]) (bfd *);
boolean (*_bfd_set_format[bfd_type_end]) (bfd *);
boolean (*_bfd_write_contents[bfd_type_end]) (bfd *);
# 3539 "bfd.h"
boolean (*_close_and_cleanup) (bfd *);
boolean (*_bfd_free_cached_info) (bfd *);
boolean (*_new_section_hook) (bfd *, sec_ptr);
boolean (*_bfd_get_section_contents) (bfd *, sec_ptr, void *, file_ptr, bfd_size_type);
boolean (*_bfd_get_section_contents_in_window)
(bfd *, sec_ptr, bfd_window *, file_ptr, bfd_size_type);
# 3560 "bfd.h"
boolean (*_bfd_copy_private_bfd_data) (bfd *, bfd *);
boolean (*_bfd_merge_private_bfd_data) (bfd *, bfd *);
boolean (*_bfd_copy_private_section_data) (bfd *, sec_ptr, bfd *, sec_ptr);
boolean (*_bfd_copy_private_symbol_data) (bfd *, asymbol *, bfd *, asymbol *);
boolean (*_bfd_set_private_flags) (bfd *, flagword);
boolean (*_bfd_print_private_bfd_data) (bfd *, void *);
char * (*_core_file_failing_command) (bfd *);
int (*_core_file_failing_signal) (bfd *);
boolean (*_core_file_matches_executable_p) (bfd *, bfd *);
# 3599 "bfd.h"
boolean (*_bfd_slurp_armap) (bfd *);
boolean (*_bfd_slurp_extended_name_table) (bfd *);
boolean (*_bfd_construct_extended_name_table)
(bfd *, char **, bfd_size_type *, const char **);
void (*_bfd_truncate_arname) (bfd *, const char *, char *);
boolean (*write_armap)
(bfd *, unsigned int, struct orl *, unsigned int, int);
void * (*_bfd_read_ar_hdr_fn) (bfd *);
bfd * (*openr_next_archived_file) (bfd *, bfd *);
bfd * (*_bfd_get_elt_at_index) (bfd *, symindex);
int (*_bfd_stat_arch_elt) (bfd *, struct stat *);
boolean (*_bfd_update_armap_timestamp) (bfd *);
# 3626 "bfd.h"
long (*_bfd_get_symtab_upper_bound) (bfd *);
long (*_bfd_canonicalize_symtab) (bfd *, struct symbol_cache_entry **);
struct symbol_cache_entry *
(*_bfd_make_empty_symbol) (bfd *);
void (*_bfd_print_symbol) (bfd *, void *, struct symbol_cache_entry *, bfd_print_symbol_type);
void (*_bfd_get_symbol_info) (bfd *, struct symbol_cache_entry *, symbol_info *);
boolean (*_bfd_is_local_label_name) (bfd *, const char *);
alent * (*_get_lineno) (bfd *, struct symbol_cache_entry *);
boolean (*_bfd_find_nearest_line)
(bfd *, struct sec *, struct symbol_cache_entry **, bfd_vma, const char **, const char **, unsigned int *);
asymbol *(*_bfd_make_debug_symbol) (bfd *, void *, unsigned long size);
long (*_read_minisymbols) (bfd *, boolean, void * *, unsigned int *);
asymbol *(*_minisymbol_to_symbol) (bfd *, boolean, const void *, asymbol *);
long (*_get_reloc_upper_bound) (bfd *, sec_ptr);
long (*_bfd_canonicalize_reloc) (bfd *, sec_ptr, arelent **, struct symbol_cache_entry **);
reloc_howto_type *
(*reloc_type_lookup) (bfd *, bfd_reloc_code_real_type);
boolean (*_bfd_set_arch_mach) (bfd *, enum bfd_architecture, unsigned long);
boolean (*_bfd_set_section_contents) (bfd *, sec_ptr, void *, file_ptr, bfd_size_type);
# 3691 "bfd.h"
int (*_bfd_sizeof_headers) (bfd *, boolean);
bfd_byte *(*_bfd_get_relocated_section_contents)
(bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *, boolean, struct symbol_cache_entry **);
boolean (*_bfd_relax_section)
(bfd *, struct sec *, struct bfd_link_info *, boolean *);
struct bfd_link_hash_table *(*_bfd_link_hash_table_create) (bfd *);
boolean (*_bfd_link_add_symbols) (bfd *, struct bfd_link_info *);
boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *);
boolean (*_bfd_link_split_section) (bfd *, struct sec *);
boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
# 3726 "bfd.h"
long (*_bfd_get_dynamic_symtab_upper_bound) (bfd *);
long (*_bfd_canonicalize_dynamic_symtab)
(bfd *, struct symbol_cache_entry **);
long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *);
long (*_bfd_canonicalize_dynamic_reloc)
(bfd *, arelent **, struct symbol_cache_entry **);
const struct bfd_target * alternative_target;
void * backend_data;
} bfd_target;
boolean
bfd_set_default_target (const char *name);
const bfd_target *
bfd_find_target (const char *target_name, bfd *abfd);
const char **
bfd_target_list (void);
const bfd_target *
bfd_search_for_target (int (* search_func) (const bfd_target *, void *), void *);
boolean
bfd_check_format (bfd *abfd, bfd_format format);
boolean
bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching);
boolean
bfd_set_format (bfd *abfd, bfd_format format);
const char *
bfd_format_string (bfd_format format);
# 68 "elfcode.h" 2
# 1 "sysdep.h" 1
# 27 "sysdep.h"
# 1 "config.h" 1
# 28 "sysdep.h" 2
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 147 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 3
typedef long int ptrdiff_t;
# 201 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 3
typedef long unsigned int size_t;
# 293 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 3
typedef int wchar_t;
# 31 "sysdep.h" 2
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 1 3
# 36 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
# 1 "/usr/include/features.h" 1 3
# 283 "/usr/include/features.h" 3
# 1 "/usr/include/sys/cdefs.h" 1 3
# 284 "/usr/include/features.h" 2 3
# 311 "/usr/include/features.h" 3
# 1 "/usr/include/gnu/stubs.h" 1 3
# 312 "/usr/include/features.h" 2 3
# 37 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 2 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 43 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 2 3
# 1 "/usr/include/bits/types.h" 1 3
# 29 "/usr/include/bits/types.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 30 "/usr/include/bits/types.h" 2 3
typedef unsigned char __u_char;
typedef unsigned short int __u_short;
typedef unsigned int __u_int;
typedef unsigned long int __u_long;
typedef unsigned long int __u_quad_t;
typedef long int __quad_t;
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
typedef signed long int __int64_t;
typedef unsigned long int __uint64_t;
typedef __quad_t *__qaddr_t;
typedef __uint64_t __dev_t;
typedef __uint32_t __uid_t;
typedef __uint32_t __gid_t;
typedef __uint32_t __ino_t;
typedef __uint64_t __ino64_t;
typedef __uint32_t __mode_t;
typedef __uint32_t __nlink_t;
typedef __int64_t __off_t;
typedef __int64_t __off64_t;
typedef __int64_t __loff_t;
typedef __int32_t __pid_t;
typedef __int64_t __ssize_t;
typedef __uint64_t __rlim_t;
typedef __uint64_t __rlim64_t;
typedef __uint32_t __blksize_t;
typedef __uint32_t __blkcnt_t;
typedef __uint64_t __blkcnt64_t;
typedef __int32_t __fsblkcnt_t;
typedef __int64_t __fsblkcnt64_t;
typedef __uint32_t __fsfilcnt_t;
typedef __uint64_t __fsfilcnt64_t;
typedef __uint32_t __id_t;
typedef struct
{
int __val[2];
} __fsid_t;
typedef int __daddr_t;
typedef char *__caddr_t;
typedef long int __time_t;
typedef unsigned int __useconds_t;
typedef long int __suseconds_t;
typedef long int __swblk_t;
typedef long int __clock_t;
typedef int __key_t;
typedef int __clockid_t;
typedef int __timer_t;
typedef int __ipc_pid_t;
typedef long int __t_scalar_t;
typedef unsigned long int __t_uscalar_t;
typedef long int __intptr_t;
typedef unsigned int __socklen_t;
# 1 "/usr/include/bits/pthreadtypes.h" 1 3
# 23 "/usr/include/bits/pthreadtypes.h" 3
# 1 "/usr/include/bits/sched.h" 1 3
# 68 "/usr/include/bits/sched.h" 3
struct __sched_param
{
int __sched_priority;
};
# 24 "/usr/include/bits/pthreadtypes.h" 2 3
struct _pthread_fastlock
{
long int __status;
int __spinlock;
};
typedef struct _pthread_descr_struct *_pthread_descr;
typedef struct __pthread_attr_s
{
int __detachstate;
int __schedpolicy;
struct __sched_param __schedparam;
int __inheritsched;
int __scope;
size_t __guardsize;
int __stackaddr_set;
void *__stackaddr;
size_t __stacksize;
} pthread_attr_t;
typedef struct
{
struct _pthread_fastlock __c_lock;
_pthread_descr __c_waiting;
} pthread_cond_t;
typedef struct
{
int __dummy;
} pthread_condattr_t;
typedef unsigned int pthread_key_t;
typedef struct
{
int __m_reserved;
int __m_count;
_pthread_descr __m_owner;
int __m_kind;
struct _pthread_fastlock __m_lock;
} pthread_mutex_t;
typedef struct
{
int __mutexkind;
} pthread_mutexattr_t;
typedef int pthread_once_t;
typedef struct _pthread_rwlock_t
{
struct _pthread_fastlock __rw_lock;
int __rw_readers;
_pthread_descr __rw_writer;
_pthread_descr __rw_read_waiting;
_pthread_descr __rw_write_waiting;
int __rw_kind;
int __rw_pshared;
} pthread_rwlock_t;
typedef struct
{
int __lockkind;
int __pshared;
} pthread_rwlockattr_t;
typedef volatile int pthread_spinlock_t;
typedef struct {
struct _pthread_fastlock __ba_lock;
int __ba_required;
int __ba_present;
_pthread_descr __ba_waiting;
} pthread_barrier_t;
typedef struct {
int __pshared;
} pthread_barrierattr_t;
typedef unsigned long int pthread_t;
# 113 "/usr/include/bits/types.h" 2 3
# 45 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 2 3
# 53 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
typedef struct _IO_FILE FILE;
# 63 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
typedef struct _IO_FILE __FILE;
# 73 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
# 1 "/usr/include/libio.h" 1 3
# 30 "/usr/include/libio.h" 3
# 1 "/usr/include/_G_config.h" 1 3
# 14 "/usr/include/_G_config.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 320 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 3
typedef unsigned int wint_t;
# 15 "/usr/include/_G_config.h" 2 3
# 24 "/usr/include/_G_config.h" 3
# 1 "/usr/include/wchar.h" 1 3
# 48 "/usr/include/wchar.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 49 "/usr/include/wchar.h" 2 3
# 1 "/usr/include/bits/wchar.h" 1 3
# 51 "/usr/include/wchar.h" 2 3
# 67 "/usr/include/wchar.h" 3
typedef struct
{
int __count;
union
{
wint_t __wch;
char __wchb[4];
} __value;
} __mbstate_t;
# 25 "/usr/include/_G_config.h" 2 3
typedef struct
{
__off_t __pos;
__mbstate_t __state;
} _G_fpos_t;
typedef struct
{
__off64_t __pos;
__mbstate_t __state;
} _G_fpos64_t;
# 44 "/usr/include/_G_config.h" 3
# 1 "/usr/include/gconv.h" 1 3
# 28 "/usr/include/gconv.h" 3
# 1 "/usr/include/wchar.h" 1 3
# 48 "/usr/include/wchar.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 49 "/usr/include/wchar.h" 2 3
# 29 "/usr/include/gconv.h" 2 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 31 "/usr/include/gconv.h" 2 3
enum
{
__GCONV_OK = 0,
__GCONV_NOCONV,
__GCONV_NODB,
__GCONV_NOMEM,
__GCONV_EMPTY_INPUT,
__GCONV_FULL_OUTPUT,
__GCONV_ILLEGAL_INPUT,
__GCONV_INCOMPLETE_INPUT,
__GCONV_ILLEGAL_DESCRIPTOR,
__GCONV_INTERNAL_ERROR
};
enum
{
__GCONV_IS_LAST = 0x0001,
__GCONV_IGNORE_ERRORS = 0x0002
};
struct __gconv_step;
struct __gconv_step_data;
struct __gconv_loaded_object;
struct __gconv_trans_data;
typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *,
__const unsigned char **, __const unsigned char *,
unsigned char **, size_t *, int, int);
typedef int (*__gconv_init_fct) (struct __gconv_step *);
typedef void (*__gconv_end_fct) (struct __gconv_step *);
typedef int (*__gconv_trans_fct) (struct __gconv_step *,
struct __gconv_step_data *, void *,
__const unsigned char *,
__const unsigned char **,
__const unsigned char *, unsigned char **,
size_t *);
typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *,
__const unsigned char *,
unsigned char *, unsigned char *);
typedef int (*__gconv_trans_query_fct) (__const char *, __const char ***,
size_t *);
typedef int (*__gconv_trans_init_fct) (void **, const char *);
typedef void (*__gconv_trans_end_fct) (void *);
struct __gconv_trans_data
{
__gconv_trans_fct __trans_fct;
__gconv_trans_context_fct __trans_context_fct;
__gconv_trans_end_fct __trans_end_fct;
void *__data;
struct __gconv_trans_data *__next;
};
struct __gconv_step
{
struct __gconv_loaded_object *__shlib_handle;
__const char *__modname;
int __counter;
char *__from_name;
char *__to_name;
__gconv_fct __fct;
__gconv_init_fct __init_fct;
__gconv_end_fct __end_fct;
int __min_needed_from;
int __max_needed_from;
int __min_needed_to;
int __max_needed_to;
int __stateful;
void *__data;
};
struct __gconv_step_data
{
unsigned char *__outbuf;
unsigned char *__outbufend;
int __flags;
int __invocation_counter;
int __internal_use;
__mbstate_t *__statep;
__mbstate_t __state;
struct __gconv_trans_data *__trans;
};
typedef struct __gconv_info
{
size_t __nsteps;
struct __gconv_step *__steps;
__extension__ struct __gconv_step_data __data [];
} *__gconv_t;
# 45 "/usr/include/_G_config.h" 2 3
typedef union
{
struct __gconv_info __cd;
struct
{
struct __gconv_info __cd;
struct __gconv_step_data __data;
} __combined;
} _G_iconv_t;
typedef int _G_int16_t __attribute__ ((__mode__ (__HI__)));
typedef int _G_int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__)));
typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__)));
# 31 "/usr/include/libio.h" 2 3
# 51 "/usr/include/libio.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdarg.h" 1 3
# 43 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdarg.h" 3
typedef __builtin_va_list __gnuc_va_list;
# 52 "/usr/include/libio.h" 2 3
# 158 "/usr/include/libio.h" 3
struct _IO_jump_t; struct _IO_FILE;
# 168 "/usr/include/libio.h" 3
typedef void _IO_lock_t;
struct _IO_marker {
struct _IO_marker *_next;
struct _IO_FILE *_sbuf;
int _pos;
# 191 "/usr/include/libio.h" 3
};
enum __codecvt_result
{
__codecvt_ok,
__codecvt_partial,
__codecvt_error,
__codecvt_noconv
};
# 259 "/usr/include/libio.h" 3
struct _IO_FILE {
int _flags;
char* _IO_read_ptr;
char* _IO_read_end;
char* _IO_read_base;
char* _IO_write_base;
char* _IO_write_ptr;
char* _IO_write_end;
char* _IO_buf_base;
char* _IO_buf_end;
char *_IO_save_base;
char *_IO_backup_base;
char *_IO_save_end;
struct _IO_marker *_markers;
struct _IO_FILE *_chain;
int _fileno;
int _blksize;
__off_t _old_offset;
unsigned short _cur_column;
signed char _vtable_offset;
char _shortbuf[1];
_IO_lock_t *_lock;
# 303 "/usr/include/libio.h" 3
__off64_t _offset;
void *__pad1;
void *__pad2;
int _mode;
char _unused2[15 * sizeof (int) - 2 * sizeof (void *)];
};
typedef struct _IO_FILE _IO_FILE;
struct _IO_FILE_plus;
extern struct _IO_FILE_plus _IO_2_1_stdin_;
extern struct _IO_FILE_plus _IO_2_1_stdout_;
extern struct _IO_FILE_plus _IO_2_1_stderr_;
# 342 "/usr/include/libio.h" 3
typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf,
size_t __n);
typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);
typedef int __io_close_fn (void *__cookie);
typedef __io_read_fn cookie_read_function_t;
typedef __io_write_fn cookie_write_function_t;
typedef __io_seek_fn cookie_seek_function_t;
typedef __io_close_fn cookie_close_function_t;
typedef struct
{
__io_read_fn *read;
__io_write_fn *write;
__io_seek_fn *seek;
__io_close_fn *close;
} _IO_cookie_io_functions_t;
typedef _IO_cookie_io_functions_t cookie_io_functions_t;
struct _IO_cookie_file;
extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
void *__cookie, _IO_cookie_io_functions_t __fns);
extern int __underflow (_IO_FILE *) ;
extern int __uflow (_IO_FILE *) ;
extern int __overflow (_IO_FILE *, int) ;
extern wint_t __wunderflow (_IO_FILE *) ;
extern wint_t __wuflow (_IO_FILE *) ;
extern wint_t __woverflow (_IO_FILE *, wint_t) ;
# 424 "/usr/include/libio.h" 3
extern int _IO_getc (_IO_FILE *__fp) ;
extern int _IO_putc (int __c, _IO_FILE *__fp) ;
extern int _IO_feof (_IO_FILE *__fp) ;
extern int _IO_ferror (_IO_FILE *__fp) ;
extern int _IO_peekc_locked (_IO_FILE *__fp) ;
extern void _IO_flockfile (_IO_FILE *) ;
extern void _IO_funlockfile (_IO_FILE *) ;
extern int _IO_ftrylockfile (_IO_FILE *) ;
# 454 "/usr/include/libio.h" 3
extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,
__gnuc_va_list, int *__restrict) ;
extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,
__gnuc_va_list) ;
extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t) ;
extern size_t _IO_sgetn (_IO_FILE *, void *, size_t) ;
extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int) ;
extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int) ;
extern void _IO_free_backup_area (_IO_FILE *) ;
# 74 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 2 3
typedef __gnuc_va_list __not_va_list__;
# 88 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
typedef _G_fpos_t fpos_t;
typedef _G_fpos64_t fpos64_t;
# 137 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
# 1 "/usr/include/bits/stdio_lim.h" 1 3
# 138 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 2 3
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
extern int remove (__const char *__filename) ;
extern int rename (__const char *__old, __const char *__new) ;
extern FILE *tmpfile (void) ;
# 166 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
extern FILE *tmpfile64 (void) ;
extern char *tmpnam (char *__s) ;
extern char *tmpnam_r (char *__s) ;
# 186 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
extern char *tempnam (__const char *__dir, __const char *__pfx)
__attribute__ ((__malloc__));
extern int fclose (FILE *__stream) ;
extern int fflush (FILE *__stream) ;
extern int fflush_unlocked (FILE *__stream) ;
extern int fcloseall (void) ;
extern FILE *fopen (__const char *__restrict __filename,
__const char *__restrict __modes) ;
extern FILE *freopen (__const char *__restrict __filename,
__const char *__restrict __modes,
FILE *__restrict __stream) ;
# 230 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
extern FILE *fopen64 (__const char *__restrict __filename,
__const char *__restrict __modes) ;
extern FILE *freopen64 (__const char *__restrict __filename,
__const char *__restrict __modes,
FILE *__restrict __stream) ;
extern FILE *fdopen (int __fd, __const char *__modes) ;
extern FILE *fopencookie (void *__restrict __magic_cookie,
__const char *__restrict __modes,
_IO_cookie_io_functions_t __io_funcs) ;
extern FILE *fmemopen (void *__s, size_t __len, __const char *__modes) ;
extern FILE *open_memstream (char **__restrict __bufloc,
size_t *__restrict __sizeloc) ;
extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) ;
extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
int __modes, size_t __n) ;
extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
size_t __size) ;
extern void setlinebuf (FILE *__stream) ;
extern int fprintf (FILE *__restrict __stream,
__const char *__restrict __format, ...) ;
extern int printf (__const char *__restrict __format, ...) ;
extern int sprintf (char *__restrict __s,
__const char *__restrict __format, ...) ;
extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg) ;
extern int vprintf (__const char *__restrict __format, __gnuc_va_list __arg)
;
extern int vsprintf (char *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg) ;
extern int snprintf (char *__restrict __s, size_t __maxlen,
__const char *__restrict __format, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
extern int vsnprintf (char *__restrict __s, size_t __maxlen,
__const char *__restrict __format, __gnuc_va_list __arg)
__attribute__ ((__format__ (__printf__, 3, 0)));
extern int vasprintf (char **__restrict __ptr, __const char *__restrict __f,
__gnuc_va_list __arg)
__attribute__ ((__format__ (__printf__, 2, 0)));
extern int __asprintf (char **__restrict __ptr,
__const char *__restrict __fmt, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));
extern int asprintf (char **__restrict __ptr,
__const char *__restrict __fmt, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));
extern int vdprintf (int __fd, __const char *__restrict __fmt,
__gnuc_va_list __arg)
__attribute__ ((__format__ (__printf__, 2, 0)));
extern int dprintf (int __fd, __const char *__restrict __fmt, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));
extern int fscanf (FILE *__restrict __stream,
__const char *__restrict __format, ...) ;
extern int scanf (__const char *__restrict __format, ...) ;
extern int sscanf (__const char *__restrict __s,
__const char *__restrict __format, ...) ;
extern int vfscanf (FILE *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg)
__attribute__ ((__format__ (__scanf__, 2, 0)));
extern int vscanf (__const char *__restrict __format, __gnuc_va_list __arg)
__attribute__ ((__format__ (__scanf__, 1, 0)));
extern int vsscanf (__const char *__restrict __s,
__const char *__restrict __format, __gnuc_va_list __arg)
__attribute__ ((__format__ (__scanf__, 2, 0)));
extern int fgetc (FILE *__stream) ;
extern int getc (FILE *__stream) ;
extern int getchar (void) ;
extern int getc_unlocked (FILE *__stream) ;
extern int getchar_unlocked (void) ;
extern int fgetc_unlocked (FILE *__stream) ;
extern int fputc (int __c, FILE *__stream) ;
extern int putc (int __c, FILE *__stream) ;
extern int putchar (int __c) ;
extern int fputc_unlocked (int __c, FILE *__stream) ;
extern int putc_unlocked (int __c, FILE *__stream) ;
extern int putchar_unlocked (int __c) ;
extern int getw (FILE *__stream) ;
extern int putw (int __w, FILE *__stream) ;
extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
;
extern char *fgets_unlocked (char *__restrict __s, int __n,
FILE *__restrict __stream) ;
extern char *gets (char *__s) ;
# 434 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
extern __ssize_t __getdelim (char **__restrict __lineptr,
size_t *__restrict __n, int __delimiter,
FILE *__restrict __stream) ;
extern __ssize_t getdelim (char **__restrict __lineptr,
size_t *__restrict __n, int __delimiter,
FILE *__restrict __stream) ;
extern __ssize_t getline (char **__restrict __lineptr,
size_t *__restrict __n,
FILE *__restrict __stream) ;
extern int fputs (__const char *__restrict __s, FILE *__restrict __stream)
;
extern int fputs_unlocked (__const char *__restrict __s,
FILE *__restrict __stream) ;
extern int puts (__const char *__s) ;
extern int ungetc (int __c, FILE *__stream) ;
extern size_t fread (void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream) ;
extern size_t fwrite (__const void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __s) ;
extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream) ;
extern size_t fwrite_unlocked (__const void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream) ;
extern int fseek (FILE *__stream, long int __off, int __whence) ;
extern long int ftell (FILE *__stream) ;
extern void rewind (FILE *__stream) ;
# 497 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
extern int fseeko (FILE *__stream, __off_t __off, int __whence) ;
extern __off_t ftello (FILE *__stream) ;
extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos)
;
extern int fsetpos (FILE *__stream, __const fpos_t *__pos) ;
# 531 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence) ;
extern __off64_t ftello64 (FILE *__stream) ;
extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos)
;
extern int fsetpos64 (FILE *__stream, __const fpos64_t *__pos) ;
extern void clearerr (FILE *__stream) ;
extern int feof (FILE *__stream) ;
extern int ferror (FILE *__stream) ;
extern void clearerr_unlocked (FILE *__stream) ;
extern int feof_unlocked (FILE *__stream) ;
extern int ferror_unlocked (FILE *__stream) ;
extern void perror (__const char *__s) ;
extern int sys_nerr;
extern __const char *__const sys_errlist[];
extern int _sys_nerr;
extern __const char *__const _sys_errlist[];
extern int fileno (FILE *__stream) ;
extern int fileno_unlocked (FILE *__stream) ;
extern FILE *popen (__const char *__command, __const char *__modes) ;
extern int pclose (FILE *__stream) ;
extern char *ctermid (char *__s) ;
extern char *cuserid (char *__s) ;
struct obstack;
extern int obstack_printf (struct obstack *__restrict __obstack,
__const char *__restrict __format, ...) ;
extern int obstack_vprintf (struct obstack *__restrict __obstack,
__const char *__restrict __format,
__gnuc_va_list __args) ;
extern void flockfile (FILE *__stream) ;
extern int ftrylockfile (FILE *__stream) ;
extern void funlockfile (FILE *__stream) ;
# 638 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 3
# 1 "/usr/include/bits/stdio.h" 1 3
# 39 "/usr/include/bits/stdio.h" 3
extern __inline int
vprintf (__const char *__restrict __fmt, __gnuc_va_list __arg)
{
return vfprintf (stdout, __fmt, __arg);
}
extern __inline int
getchar (void)
{
return _IO_getc (stdin);
}
extern __inline int
getc_unlocked (FILE *__fp)
{
return ((__fp)->_IO_read_ptr >= (__fp)->_IO_read_end ? __uflow (__fp) : *(unsigned char *) (__fp)->_IO_read_ptr++);
}
extern __inline int
getchar_unlocked (void)
{
return ((stdin)->_IO_read_ptr >= (stdin)->_IO_read_end ? __uflow (stdin) : *(unsigned char *) (stdin)->_IO_read_ptr++);
}
extern __inline int
putchar (int __c)
{
return _IO_putc (__c, stdout);
}
extern __inline int
fputc_unlocked (int __c, FILE *__stream)
{
return (((__stream)->_IO_write_ptr >= (__stream)->_IO_write_end) ? __overflow (__stream, (unsigned char) (__c)) : (unsigned char) (*(__stream)->_IO_write_ptr++ = (__c)));
}
extern __inline int
putc_unlocked (int __c, FILE *__stream)
{
return (((__stream)->_IO_write_ptr >= (__stream)->_IO_write_end) ? __overflow (__stream, (unsigned char) (__c)) : (unsigned char) (*(__stream)->_IO_write_ptr++ = (__c)));
}
extern __inline int
putchar_unlocked (int __c)
{
return (((stdout)->_IO_write_ptr >= (stdout)->_IO_write_end) ? __overflow (stdout, (unsigned char) (__c)) : (unsigned char) (*(stdout)->_IO_write_ptr++ = (__c)));
}
extern __inline __ssize_t
getline (char **__lineptr, size_t *__n, FILE *__stream)
{
return __getdelim (__lineptr, __n, '\n', __stream);
}
extern __inline int
feof_unlocked (FILE *__stream)
{
return (((__stream)->_flags & 0x10) != 0);
}
extern __inline int
ferror_unlocked (FILE *__stream)
{
return (((__stream)->_flags & 0x20) != 0);
}
# 639 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdio.h" 2 3
# 34 "sysdep.h" 2
# 1 "/usr/include/sys/types.h" 1 3
# 28 "/usr/include/sys/types.h" 3
typedef __u_char u_char;
typedef __u_short u_short;
typedef __u_int u_int;
typedef __u_long u_long;
typedef __quad_t quad_t;
typedef __u_quad_t u_quad_t;
typedef __fsid_t fsid_t;
typedef __loff_t loff_t;
typedef __ino_t ino_t;
typedef __ino64_t ino64_t;
typedef __dev_t dev_t;
typedef __gid_t gid_t;
typedef __mode_t mode_t;
typedef __nlink_t nlink_t;
typedef __uid_t uid_t;
typedef __off_t off_t;
typedef __off64_t off64_t;
typedef __pid_t pid_t;
typedef __id_t id_t;
typedef __ssize_t ssize_t;
typedef __daddr_t daddr_t;
typedef __caddr_t caddr_t;
typedef __key_t key_t;
# 126 "/usr/include/sys/types.h" 3
# 1 "/usr/include/time.h" 1 3
# 59 "/usr/include/time.h" 3
typedef __clock_t clock_t;
# 70 "/usr/include/time.h" 3
typedef __time_t time_t;
# 82 "/usr/include/time.h" 3
typedef __clockid_t clockid_t;
# 94 "/usr/include/time.h" 3
typedef __timer_t timer_t;
# 127 "/usr/include/sys/types.h" 2 3
typedef __useconds_t useconds_t;
typedef __suseconds_t suseconds_t;
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 141 "/usr/include/sys/types.h" 2 3
typedef unsigned long int ulong;
typedef unsigned short int ushort;
typedef unsigned int uint;
# 184 "/usr/include/sys/types.h" 3
typedef int int8_t __attribute__ ((__mode__ (__QI__)));
typedef int int16_t __attribute__ ((__mode__ (__HI__)));
typedef int int32_t __attribute__ ((__mode__ (__SI__)));
typedef int int64_t __attribute__ ((__mode__ (__DI__)));
typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__)));
typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__)));
typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__)));
typedef int register_t __attribute__ ((__mode__ (__word__)));
# 206 "/usr/include/sys/types.h" 3
# 1 "/usr/include/endian.h" 1 3
# 37 "/usr/include/endian.h" 3
# 1 "/usr/include/bits/endian.h" 1 3
# 38 "/usr/include/endian.h" 2 3
# 207 "/usr/include/sys/types.h" 2 3
# 1 "/usr/include/sys/select.h" 1 3
# 31 "/usr/include/sys/select.h" 3
# 1 "/usr/include/bits/select.h" 1 3
# 32 "/usr/include/sys/select.h" 2 3
# 1 "/usr/include/bits/sigset.h" 1 3
# 23 "/usr/include/bits/sigset.h" 3
typedef int __sig_atomic_t;
typedef struct
{
unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))];
} __sigset_t;
# 35 "/usr/include/sys/select.h" 2 3
typedef __sigset_t sigset_t;
# 1 "/usr/include/time.h" 1 3
# 106 "/usr/include/time.h" 3
struct timespec
{
long int tv_sec;
long int tv_nsec;
};
# 44 "/usr/include/sys/select.h" 2 3
# 1 "/usr/include/bits/time.h" 1 3
# 63 "/usr/include/bits/time.h" 3
struct timeval
{
__time_t tv_sec;
__suseconds_t tv_usec;
};
# 46 "/usr/include/sys/select.h" 2 3
typedef long int __fd_mask;
typedef struct
{
__fd_mask fds_bits[1024 / (8 * sizeof (__fd_mask))];
} fd_set;
typedef __fd_mask fd_mask;
# 89 "/usr/include/sys/select.h" 3
extern int select (int __nfds, fd_set *__restrict __readfds,
fd_set *__restrict __writefds,
fd_set *__restrict __exceptfds,
struct timeval *__restrict __timeout) ;
extern int pselect (int __nfds, fd_set *__restrict __readfds,
fd_set *__restrict __writefds,
fd_set *__restrict __exceptfds,
const struct timespec *__restrict __timeout,
const __sigset_t *__restrict __sigmask) ;
# 210 "/usr/include/sys/types.h" 2 3
# 1 "/usr/include/sys/sysmacros.h" 1 3
# 213 "/usr/include/sys/types.h" 2 3
typedef __blksize_t blksize_t;
typedef __blkcnt_t blkcnt_t;
typedef __fsblkcnt_t fsblkcnt_t;
typedef __fsfilcnt_t fsfilcnt_t;
# 251 "/usr/include/sys/types.h" 3
typedef __blkcnt64_t blkcnt64_t;
typedef __fsblkcnt64_t fsblkcnt64_t;
typedef __fsfilcnt64_t fsfilcnt64_t;
# 35 "sysdep.h" 2
# 1 "/usr/include/sys/stat.h" 1 3
# 32 "/usr/include/sys/stat.h" 3
# 1 "/usr/include/time.h" 1 3
# 33 "/usr/include/sys/stat.h" 2 3
# 96 "/usr/include/sys/stat.h" 3
# 1 "/usr/include/bits/stat.h" 1 3
# 32 "/usr/include/bits/stat.h" 3
struct stat
{
__dev_t st_dev;
__ino_t st_ino;
int __pad1;
__mode_t st_mode;
__nlink_t st_nlink;
__uid_t st_uid;
__gid_t st_gid;
__dev_t st_rdev;
__off_t st_size;
__time_t st_atime;
__time_t st_mtime;
__time_t st_ctime;
__blkcnt_t st_blocks;
int __pad2;
__blksize_t st_blksize;
unsigned int st_flags;
unsigned int st_gen;
int __pad3;
long __unused[4];
};
struct stat64
{
__dev_t st_dev;
__ino64_t st_ino;
__mode_t st_mode;
__nlink_t st_nlink;
__uid_t st_uid;
__gid_t st_gid;
__dev_t st_rdev;
__off_t st_size;
__time_t st_atime;
__time_t st_mtime;
__time_t st_ctime;
__blkcnt64_t st_blocks;
__blksize_t st_blksize;
unsigned int st_flags;
unsigned int st_gen;
int __pad3;
long __unused[4];
};
# 99 "/usr/include/sys/stat.h" 2 3
# 200 "/usr/include/sys/stat.h" 3
extern int stat (__const char *__restrict __file,
struct stat *__restrict __buf) ;
extern int fstat (int __fd, struct stat *__buf) ;
# 219 "/usr/include/sys/stat.h" 3
extern int stat64 (__const char *__restrict __file,
struct stat64 *__restrict __buf) ;
extern int fstat64 (int __fd, struct stat64 *__buf) ;
extern int lstat (__const char *__restrict __file,
struct stat *__restrict __buf) ;
# 241 "/usr/include/sys/stat.h" 3
extern int lstat64 (__const char *__restrict __file,
struct stat64 *__restrict __buf) ;
extern int chmod (__const char *__file, __mode_t __mode) ;
extern int fchmod (int __fd, __mode_t __mode) ;
extern __mode_t umask (__mode_t __mask) ;
extern __mode_t getumask (void) ;
extern int mkdir (__const char *__path, __mode_t __mode) ;
extern int mknod (__const char *__path, __mode_t __mode, __dev_t __dev)
;
extern int mkfifo (__const char *__path, __mode_t __mode) ;
# 306 "/usr/include/sys/stat.h" 3
extern int __fxstat (int __ver, int __fildes, struct stat *__stat_buf) ;
extern int __xstat (int __ver, __const char *__filename,
struct stat *__stat_buf) ;
extern int __lxstat (int __ver, __const char *__filename,
struct stat *__stat_buf) ;
# 330 "/usr/include/sys/stat.h" 3
extern int __fxstat64 (int __ver, int __fildes, struct stat64 *__stat_buf)
;
extern int __xstat64 (int __ver, __const char *__filename,
struct stat64 *__stat_buf) ;
extern int __lxstat64 (int __ver, __const char *__filename,
struct stat64 *__stat_buf) ;
extern int __xmknod (int __ver, __const char *__path, __mode_t __mode,
__dev_t *__dev) ;
extern __inline__ int stat (__const char *__path,
struct stat *__statbuf)
{
return __xstat (2, __path, __statbuf);
}
extern __inline__ int lstat (__const char *__path,
struct stat *__statbuf)
{
return __lxstat (2, __path, __statbuf);
}
extern __inline__ int fstat (int __fd, struct stat *__statbuf)
{
return __fxstat (2, __fd, __statbuf);
}
extern __inline__ int mknod (__const char *__path, __mode_t __mode,
__dev_t __dev)
{
return __xmknod (0, __path, __mode, &__dev);
}
extern __inline__ int stat64 (__const char *__path,
struct stat64 *__statbuf)
{
return __xstat64 (2, __path, __statbuf);
}
extern __inline__ int lstat64 (__const char *__path,
struct stat64 *__statbuf)
{
return __lxstat64 (2, __path, __statbuf);
}
extern __inline__ int fstat64 (int __fd, struct stat64 *__statbuf)
{
return __fxstat64 (2, __fd, __statbuf);
}
# 36 "sysdep.h" 2
# 1 "/usr/include/errno.h" 1 3
# 32 "/usr/include/errno.h" 3
# 1 "/usr/include/bits/errno.h" 1 3
# 25 "/usr/include/bits/errno.h" 3
# 1 "/usr/include/linux/errno.h" 1 3
# 1 "/usr/include/asm/errno.h" 1 3
# 5 "/usr/include/linux/errno.h" 2 3
# 26 "/usr/include/bits/errno.h" 2 3
# 36 "/usr/include/bits/errno.h" 3
extern int errno;
extern int *__errno_location (void) __attribute__ ((__const__));
# 37 "/usr/include/errno.h" 2 3
# 55 "/usr/include/errno.h" 3
extern char *program_invocation_name, *program_invocation_short_name;
# 69 "/usr/include/errno.h" 3
typedef int error_t;
# 38 "sysdep.h" 2
# 1 "/usr/include/string.h" 1 3
# 28 "/usr/include/string.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 34 "/usr/include/string.h" 2 3
extern void *memcpy (void *__restrict __dest,
__const void *__restrict __src, size_t __n) ;
extern void *memmove (void *__dest, __const void *__src, size_t __n)
;
extern void *memccpy (void *__restrict __dest, __const void *__restrict __src,
int __c, size_t __n)
;
extern void *memset (void *__s, int __c, size_t __n) ;
extern int memcmp (__const void *__s1, __const void *__s2, size_t __n)
__attribute__ ((__pure__));
extern void *memchr (__const void *__s, int __c, size_t __n)
__attribute__ ((__pure__));
extern void *rawmemchr (__const void *__s, int __c) __attribute__ ((__pure__));
extern void *memrchr (__const void *__s, int __c, size_t __n)
__attribute__ ((__pure__));
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
;
extern char *strncpy (char *__restrict __dest,
__const char *__restrict __src, size_t __n) ;
extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
;
extern char *strncat (char *__restrict __dest, __const char *__restrict __src,
size_t __n) ;
extern int strcmp (__const char *__s1, __const char *__s2)
__attribute__ ((__pure__));
extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
__attribute__ ((__pure__));
extern int strcoll (__const char *__s1, __const char *__s2)
__attribute__ ((__pure__));
extern size_t strxfrm (char *__restrict __dest,
__const char *__restrict __src, size_t __n) ;
# 1 "/usr/include/xlocale.h" 1 3
# 28 "/usr/include/xlocale.h" 3
typedef struct __locale_struct
{
struct locale_data *__locales[13];
const unsigned short int *__ctype_b;
const int *__ctype_tolower;
const int *__ctype_toupper;
} *__locale_t;
# 109 "/usr/include/string.h" 2 3
extern int __strcoll_l (__const char *__s1, __const char *__s2, __locale_t __l)
__attribute__ ((__pure__));
extern size_t __strxfrm_l (char *__dest, __const char *__src, size_t __n,
__locale_t __l) ;
extern char *strdup (__const char *__s) __attribute__ ((__malloc__));
extern char *strndup (__const char *__string, size_t __n)
__attribute__ ((__malloc__));
# 155 "/usr/include/string.h" 3
extern char *strchr (__const char *__s, int __c) __attribute__ ((__pure__));
extern char *strrchr (__const char *__s, int __c) __attribute__ ((__pure__));
extern char *strchrnul (__const char *__s, int __c) __attribute__ ((__pure__));
extern size_t strcspn (__const char *__s, __const char *__reject)
__attribute__ ((__pure__));
extern size_t strspn (__const char *__s, __const char *__accept)
__attribute__ ((__pure__));
extern char *strpbrk (__const char *__s, __const char *__accept)
__attribute__ ((__pure__));
extern char *strstr (__const char *__haystack, __const char *__needle)
__attribute__ ((__pure__));
extern char *strcasestr (__const char *__haystack, __const char *__needle)
__attribute__ ((__pure__));
extern char *strtok (char *__restrict __s, __const char *__restrict __delim)
;
extern char *__strtok_r (char *__restrict __s,
__const char *__restrict __delim,
char **__restrict __save_ptr) ;
extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim,
char **__restrict __save_ptr) ;
extern void *memmem (__const void *__haystack, size_t __haystacklen,
__const void *__needle, size_t __needlelen)
__attribute__ ((__pure__));
extern void *__mempcpy (void *__restrict __dest,
__const void *__restrict __src, size_t __n) ;
extern void *mempcpy (void *__restrict __dest,
__const void *__restrict __src, size_t __n) ;
extern size_t strlen (__const char *__s) __attribute__ ((__pure__));
extern size_t strnlen (__const char *__string, size_t __maxlen)
__attribute__ ((__pure__));
extern char *strerror (int __errnum) ;
extern char *strerror_r (int __errnum, char *__buf, size_t __buflen) ;
extern void __bzero (void *__s, size_t __n) ;
extern void bcopy (__const void *__src, void *__dest, size_t __n) ;
extern void bzero (void *__s, size_t __n) ;
extern int bcmp (__const void *__s1, __const void *__s2, size_t __n)
__attribute__ ((__pure__));
extern char *index (__const char *__s, int __c) __attribute__ ((__pure__));
extern char *rindex (__const char *__s, int __c) __attribute__ ((__pure__));
extern int ffs (int __i) __attribute__ ((__const__));
extern int ffsl (long int __l) __attribute__ ((__const__));
__extension__ extern int ffsll (long long int __ll)
__attribute__ ((__const__));
extern int strcasecmp (__const char *__s1, __const char *__s2)
__attribute__ ((__pure__));
extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n)
__attribute__ ((__pure__));
extern int __strcasecmp_l (__const char *__s1, __const char *__s2,
__locale_t __loc) __attribute__ ((__pure__));
extern int __strncasecmp_l (__const char *__s1, __const char *__s2,
size_t __n, __locale_t __loc)
__attribute__ ((__pure__));
extern char *strsep (char **__restrict __stringp,
__const char *__restrict __delim) ;
extern int strverscmp (__const char *__s1, __const char *__s2)
__attribute__ ((__pure__));
extern char *strsignal (int __sig) ;
extern char *__stpcpy (char *__restrict __dest, __const char *__restrict __src)
;
extern char *stpcpy (char *__restrict __dest, __const char *__restrict __src)
;
extern char *__stpncpy (char *__restrict __dest,
__const char *__restrict __src, size_t __n) ;
extern char *stpncpy (char *__restrict __dest,
__const char *__restrict __src, size_t __n) ;
extern char *strfry (char *__string) ;
extern void *memfrob (void *__s, size_t __n) ;
extern char *basename (__const char *__filename) ;
# 356 "/usr/include/string.h" 3
# 1 "/usr/include/bits/string.h" 1 3
# 357 "/usr/include/string.h" 2 3
# 1 "/usr/include/bits/string2.h" 1 3
# 80 "/usr/include/bits/string2.h" 3
typedef struct { unsigned char __arr[2]; } __STRING2_COPY_ARR2 __attribute__ ((packed));
typedef struct { unsigned char __arr[3]; } __STRING2_COPY_ARR3 __attribute__ ((packed));
typedef struct { unsigned char __arr[4]; } __STRING2_COPY_ARR4 __attribute__ ((packed));
typedef struct { unsigned char __arr[5]; } __STRING2_COPY_ARR5 __attribute__ ((packed));
typedef struct { unsigned char __arr[6]; } __STRING2_COPY_ARR6 __attribute__ ((packed));
typedef struct { unsigned char __arr[7]; } __STRING2_COPY_ARR7 __attribute__ ((packed));
typedef struct { unsigned char __arr[8]; } __STRING2_COPY_ARR8 __attribute__ ((packed));
# 311 "/usr/include/bits/string2.h" 3
extern __inline void *__mempcpy_small (void *, char, __STRING2_COPY_ARR2,
__STRING2_COPY_ARR3,
__STRING2_COPY_ARR4,
__STRING2_COPY_ARR5,
__STRING2_COPY_ARR6,
__STRING2_COPY_ARR7,
__STRING2_COPY_ARR8, size_t);
extern __inline void *
__mempcpy_small (void *__dest, char __src1,
__STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
__STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
__STRING2_COPY_ARR8 __src8, size_t __srclen)
{
union {
char __c;
__STRING2_COPY_ARR2 __sca2;
__STRING2_COPY_ARR3 __sca3;
__STRING2_COPY_ARR4 __sca4;
__STRING2_COPY_ARR5 __sca5;
__STRING2_COPY_ARR6 __sca6;
__STRING2_COPY_ARR7 __sca7;
__STRING2_COPY_ARR8 __sca8;
} *__u = __dest;
switch ((unsigned int) __srclen)
{
case 1:
__u->__c = __src1;
break;
case 2:
__extension__ __u->__sca2 = __src2;
break;
case 3:
__extension__ __u->__sca3 = __src3;
break;
case 4:
__extension__ __u->__sca4 = __src4;
break;
case 5:
__extension__ __u->__sca5 = __src5;
break;
case 6:
__extension__ __u->__sca6 = __src6;
break;
case 7:
__extension__ __u->__sca7 = __src7;
break;
case 8:
__extension__ __u->__sca8 = __src8;
break;
}
return __extension__ ((void *) __u + __srclen);
}
extern void *__rawmemchr (const void *__s, int __c);
# 477 "/usr/include/bits/string2.h" 3
extern __inline char *__strcpy_small (char *, __STRING2_COPY_ARR2,
__STRING2_COPY_ARR3,
__STRING2_COPY_ARR4,
__STRING2_COPY_ARR5,
__STRING2_COPY_ARR6,
__STRING2_COPY_ARR7,
__STRING2_COPY_ARR8, size_t);
extern __inline char *
__strcpy_small (char *__dest,
__STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
__STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
__STRING2_COPY_ARR8 __src8, size_t __srclen)
{
union {
char __c;
__STRING2_COPY_ARR2 __sca2;
__STRING2_COPY_ARR3 __sca3;
__STRING2_COPY_ARR4 __sca4;
__STRING2_COPY_ARR5 __sca5;
__STRING2_COPY_ARR6 __sca6;
__STRING2_COPY_ARR7 __sca7;
__STRING2_COPY_ARR8 __sca8;
} *__u = (void *) __dest;
switch ((unsigned int) __srclen)
{
case 1:
__u->__c = '\0';
break;
case 2:
__extension__ __u->__sca2 = __src2;
break;
case 3:
__extension__ __u->__sca3 = __src3;
break;
case 4:
__extension__ __u->__sca4 = __src4;
break;
case 5:
__extension__ __u->__sca5 = __src5;
break;
case 6:
__extension__ __u->__sca6 = __src6;
break;
case 7:
__extension__ __u->__sca7 = __src7;
break;
case 8:
__extension__ __u->__sca8 = __src8;
break;
}
return __dest;
}
# 641 "/usr/include/bits/string2.h" 3
extern __inline char *__stpcpy_small (char *, __STRING2_COPY_ARR2,
__STRING2_COPY_ARR3,
__STRING2_COPY_ARR4,
__STRING2_COPY_ARR5,
__STRING2_COPY_ARR6,
__STRING2_COPY_ARR7,
__STRING2_COPY_ARR8, size_t);
extern __inline char *
__stpcpy_small (char *__dest,
__STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
__STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
__STRING2_COPY_ARR8 __src8, size_t __srclen)
{
union {
char __c;
__STRING2_COPY_ARR2 __sca2;
__STRING2_COPY_ARR3 __sca3;
__STRING2_COPY_ARR4 __sca4;
__STRING2_COPY_ARR5 __sca5;
__STRING2_COPY_ARR6 __sca6;
__STRING2_COPY_ARR7 __sca7;
__STRING2_COPY_ARR8 __sca8;
} *__u = (void *) __dest;
switch ((unsigned int) __srclen)
{
case 1:
__u->__c = '\0';
break;
case 2:
__extension__ __u->__sca2 = __src2;
break;
case 3:
__extension__ __u->__sca3 = __src3;
break;
case 4:
__extension__ __u->__sca4 = __src4;
break;
case 5:
__extension__ __u->__sca5 = __src5;
break;
case 6:
__extension__ __u->__sca6 = __src6;
break;
case 7:
__extension__ __u->__sca7 = __src7;
break;
case 8:
__extension__ __u->__sca8 = __src8;
break;
}
return __dest + __srclen - 1;
}
# 873 "/usr/include/bits/string2.h" 3
extern __inline size_t __strcspn_c1 (__const char *__s, char __reject);
extern __inline size_t
__strcspn_c1 (__const char *__s, char __reject)
{
register size_t __result = 0;
while (__s[__result] != '\0' && __s[__result] != __reject)
++__result;
return __result;
}
extern __inline size_t __strcspn_c2 (__const char *__s, char __reject1,
char __reject2);
extern __inline size_t
__strcspn_c2 (__const char *__s, char __reject1, char __reject2)
{
register size_t __result = 0;
while (__s[__result] != '\0' && __s[__result] != __reject1
&& __s[__result] != __reject2)
++__result;
return __result;
}
extern __inline size_t __strcspn_c3 (__const char *__s, char __reject1,
char __reject2, char __reject3);
extern __inline size_t
__strcspn_c3 (__const char *__s, char __reject1, char __reject2,
char __reject3)
{
register size_t __result = 0;
while (__s[__result] != '\0' && __s[__result] != __reject1
&& __s[__result] != __reject2 && __s[__result] != __reject3)
++__result;
return __result;
}
# 928 "/usr/include/bits/string2.h" 3
extern __inline size_t __strspn_c1 (__const char *__s, char __accept);
extern __inline size_t
__strspn_c1 (__const char *__s, char __accept)
{
register size_t __result = 0;
while (__s[__result] == __accept)
++__result;
return __result;
}
extern __inline size_t __strspn_c2 (__const char *__s, char __accept1,
char __accept2);
extern __inline size_t
__strspn_c2 (__const char *__s, char __accept1, char __accept2)
{
register size_t __result = 0;
while (__s[__result] == __accept1 || __s[__result] == __accept2)
++__result;
return __result;
}
extern __inline size_t __strspn_c3 (__const char *__s, char __accept1,
char __accept2, char __accept3);
extern __inline size_t
__strspn_c3 (__const char *__s, char __accept1, char __accept2, char __accept3)
{
register size_t __result = 0;
while (__s[__result] == __accept1 || __s[__result] == __accept2
|| __s[__result] == __accept3)
++__result;
return __result;
}
# 983 "/usr/include/bits/string2.h" 3
extern __inline char *__strpbrk_c2 (__const char *__s, int __accept1,
int __accept2);
extern __inline char *
__strpbrk_c2 (__const char *__s, int __accept1, int __accept2)
{
while (*__s != '\0' && *__s != __accept1 && *__s != __accept2)
++__s;
return *__s == '\0' ? ((void *)0) : (char *) (size_t) __s;
}
extern __inline char *__strpbrk_c3 (__const char *__s, int __accept1,
int __accept2, int __accept3);
extern __inline char *
__strpbrk_c3 (__const char *__s, int __accept1, int __accept2,
int __accept3)
{
while (*__s != '\0' && *__s != __accept1 && *__s != __accept2
&& *__s != __accept3)
++__s;
return *__s == '\0' ? ((void *)0) : (char *) (size_t) __s;
}
# 1026 "/usr/include/bits/string2.h" 3
extern __inline size_t
strnlen (__const char *__string, size_t __maxlen)
{
__const char *__end = (__const char *) memchr (__string, '\0', __maxlen);
return __end ? (size_t) (__end - __string) : __maxlen;
}
# 1045 "/usr/include/bits/string2.h" 3
extern __inline char *__strtok_r_1c (char *__s, char __sep, char **__nextp);
extern __inline char *
__strtok_r_1c (char *__s, char __sep, char **__nextp)
{
char *__result;
if (__s == ((void *)0))
__s = *__nextp;
while (*__s == __sep)
++__s;
if (*__s == '\0')
__result = ((void *)0);
else
{
__result = __s;
while (*__s != '\0' && *__s != __sep)
++__s;
if (*__s == '\0')
*__nextp = __s;
else
{
*__s = '\0';
*__nextp = __s + 1;
}
}
return __result;
}
# 1095 "/usr/include/bits/string2.h" 3
extern __inline char *__strsep_1c (char **__s, char __reject);
extern __inline char *
__strsep_1c (char **__s, char __reject)
{
register char *__retval = *__s;
if (__retval == ((void *)0))
return *__s = ((void *)0);
if (*__retval == __reject)
*(*__s)++ = '\0';
else
if ((*__s = (__extension__ (__builtin_constant_p (__reject) && (__reject) == '\0' ? (char *) __rawmemchr (__retval, __reject) : strchr (__retval, __reject)))) != ((void *)0))
*(*__s)++ = '\0';
else
*__s = ((void *)0);
return __retval;
}
extern __inline char *__strsep_2c (char **__s, char __reject1, char __reject2);
extern __inline char *
__strsep_2c (char **__s, char __reject1, char __reject2)
{
register char *__retval = *__s;
if (__retval == ((void *)0))
return *__s = ((void *)0);
if (*__retval == __reject1 || *__retval == __reject2)
*(*__s)++ = '\0';
else
{
register char *__cp = __retval;
while (*__cp != '\0' && *__cp != __reject1 && *__cp != __reject2)
++__cp;
if (*__cp != '\0')
{
*__s = __cp;
*(*__s)++ = '\0';
}
else
*__s = ((void *)0);
}
return __retval;
}
extern __inline char *__strsep_3c (char **__s, char __reject1, char __reject2,
char __reject3);
extern __inline char *
__strsep_3c (char **__s, char __reject1, char __reject2, char __reject3)
{
register char *__retval = *__s;
if (__retval == ((void *)0))
return *__s = ((void *)0);
if (*__retval == __reject1 || *__retval == __reject2
|| *__retval == __reject3)
*(*__s)++ = '\0';
else
{
register char *__cp = __retval;
while (*__cp != '\0' && *__cp != __reject1 && *__cp != __reject2
&& *__cp != __reject3)
++__cp;
if (*__cp != '\0')
{
*__s = __cp;
*(*__s)++ = '\0';
}
else
*__s = ((void *)0);
}
return __retval;
}
extern __inline char *__strsep_g (char **__s, __const char *__reject);
extern __inline char *
__strsep_g (char **__s, __const char *__reject)
{
register char *__retval = *__s;
if (__retval == ((void *)0))
return ((void *)0);
if ((*__s = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p (__reject) && ((size_t)(const void *)((__reject) + 1) - (size_t)(const void *)(__reject) == 1) ? ((__a0 = ((__const char *) (__reject))[0], __a0 == '\0') ? ((void) (__retval), ((void *)0)) : ((__a1 = ((__const char *) (__reject))[1], __a1 == '\0') ? (__extension__ (__builtin_constant_p (__a0) && (__a0) == '\0' ? (char *) __rawmemchr (__retval, __a0) : strchr (__retval, __a0))) : ((__a2 = ((__const char *) (__reject))[2], __a2 == '\0') ? __strpbrk_c2 (__retval, __a0, __a1) : (((__const char *) (__reject))[3] == '\0' ? __strpbrk_c3 (__retval, __a0, __a1, __a2) : strpbrk (__retval, __reject))))) : strpbrk (__retval, __reject)); })) != ((void *)0))
*(*__s)++ = '\0';
return __retval;
}
# 1188 "/usr/include/bits/string2.h" 3
# 1 "/usr/include/stdlib.h" 1 3
# 33 "/usr/include/stdlib.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 34 "/usr/include/stdlib.h" 2 3
# 528 "/usr/include/stdlib.h" 3
extern void *malloc (size_t __size) __attribute__ ((__malloc__));
extern void *calloc (size_t __nmemb, size_t __size)
__attribute__ ((__malloc__));
# 865 "/usr/include/stdlib.h" 3
# 1189 "/usr/include/bits/string2.h" 2 3
extern char *__strdup (__const char *__string) __attribute__ ((__malloc__));
# 1212 "/usr/include/bits/string2.h" 3
extern char *__strndup (__const char *__string, size_t __n)
__attribute__ ((__malloc__));
# 360 "/usr/include/string.h" 2 3
# 44 "sysdep.h" 2
# 54 "sysdep.h"
# 1 "/usr/include/stdlib.h" 1 3
# 33 "/usr/include/stdlib.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 34 "/usr/include/stdlib.h" 2 3
# 1 "/usr/include/bits/waitflags.h" 1 3
# 43 "/usr/include/stdlib.h" 2 3
# 1 "/usr/include/bits/waitstatus.h" 1 3
# 65 "/usr/include/bits/waitstatus.h" 3
union wait
{
int w_status;
struct
{
unsigned int __w_termsig:7;
unsigned int __w_coredump:1;
unsigned int __w_retcode:8;
unsigned int:16;
} __wait_terminated;
struct
{
unsigned int __w_stopval:8;
unsigned int __w_stopsig:8;
unsigned int:16;
} __wait_stopped;
};
# 44 "/usr/include/stdlib.h" 2 3
# 68 "/usr/include/stdlib.h" 3
typedef union
{
union wait *__uptr;
int *__iptr;
} __WAIT_STATUS __attribute__ ((__transparent_union__));
# 94 "/usr/include/stdlib.h" 3
typedef struct
{
int quot;
int rem;
} div_t;
typedef struct
{
long int quot;
long int rem;
} ldiv_t;
__extension__ typedef struct
{
long long int quot;
long long int rem;
} lldiv_t;
# 133 "/usr/include/stdlib.h" 3
extern size_t __ctype_get_mb_cur_max (void) ;
extern double atof (__const char *__nptr) __attribute__ ((__pure__));
extern int atoi (__const char *__nptr) __attribute__ ((__pure__));
extern long int atol (__const char *__nptr) __attribute__ ((__pure__));
__extension__ extern long long int atoll (__const char *__nptr)
__attribute__ ((__pure__));
extern double strtod (__const char *__restrict __nptr,
char **__restrict __endptr) ;
extern float strtof (__const char *__restrict __nptr,
char **__restrict __endptr) ;
extern long double strtold (__const char *__restrict __nptr,
char **__restrict __endptr) ;
extern long int strtol (__const char *__restrict __nptr,
char **__restrict __endptr, int __base) ;
extern unsigned long int strtoul (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
;
__extension__
extern long long int strtoq (__const char *__restrict __nptr,
char **__restrict __endptr, int __base) ;
__extension__
extern unsigned long long int strtouq (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
;
__extension__
extern long long int strtoll (__const char *__restrict __nptr,
char **__restrict __endptr, int __base) ;
__extension__
extern unsigned long long int strtoull (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
;
# 215 "/usr/include/stdlib.h" 3
extern long int __strtol_l (__const char *__restrict __nptr,
char **__restrict __endptr, int __base,
__locale_t __loc) ;
extern unsigned long int __strtoul_l (__const char *__restrict __nptr,
char **__restrict __endptr,
int __base, __locale_t __loc) ;
__extension__
extern long long int __strtoll_l (__const char *__restrict __nptr,
char **__restrict __endptr, int __base,
__locale_t __loc) ;
__extension__
extern unsigned long long int __strtoull_l (__const char *__restrict __nptr,
char **__restrict __endptr,
int __base, __locale_t __loc)
;
extern double __strtod_l (__const char *__restrict __nptr,
char **__restrict __endptr, __locale_t __loc)
;
extern float __strtof_l (__const char *__restrict __nptr,
char **__restrict __endptr, __locale_t __loc) ;
extern long double __strtold_l (__const char *__restrict __nptr,
char **__restrict __endptr,
__locale_t __loc) ;
extern double __strtod_internal (__const char *__restrict __nptr,
char **__restrict __endptr, int __group)
;
extern float __strtof_internal (__const char *__restrict __nptr,
char **__restrict __endptr, int __group)
;
extern long double __strtold_internal (__const char *__restrict __nptr,
char **__restrict __endptr,
int __group) ;
extern long int __strtol_internal (__const char *__restrict __nptr,
char **__restrict __endptr,
int __base, int __group) ;
extern unsigned long int __strtoul_internal (__const char *__restrict __nptr,
char **__restrict __endptr,
int __base, int __group) ;
__extension__
extern long long int __strtoll_internal (__const char *__restrict __nptr,
char **__restrict __endptr,
int __base, int __group) ;
__extension__
extern unsigned long long int __strtoull_internal (__const char *
__restrict __nptr,
char **__restrict __endptr,
int __base, int __group)
;
# 294 "/usr/include/stdlib.h" 3
extern __inline double
strtod (__const char *__restrict __nptr, char **__restrict __endptr)
{
return __strtod_internal (__nptr, __endptr, 0);
}
extern __inline long int
strtol (__const char *__restrict __nptr, char **__restrict __endptr,
int __base)
{
return __strtol_internal (__nptr, __endptr, __base, 0);
}
extern __inline unsigned long int
strtoul (__const char *__restrict __nptr, char **__restrict __endptr,
int __base)
{
return __strtoul_internal (__nptr, __endptr, __base, 0);
}
extern __inline float
strtof (__const char *__restrict __nptr, char **__restrict __endptr)
{
return __strtof_internal (__nptr, __endptr, 0);
}
extern __inline long double
strtold (__const char *__restrict __nptr, char **__restrict __endptr)
{
return __strtold_internal (__nptr, __endptr, 0);
}
__extension__ extern __inline long long int
strtoq (__const char *__restrict __nptr, char **__restrict __endptr,
int __base)
{
return __strtoll_internal (__nptr, __endptr, __base, 0);
}
__extension__ extern __inline unsigned long long int
strtouq (__const char *__restrict __nptr, char **__restrict __endptr,
int __base)
{
return __strtoull_internal (__nptr, __endptr, __base, 0);
}
__extension__ extern __inline long long int
strtoll (__const char *__restrict __nptr, char **__restrict __endptr,
int __base)
{
return __strtoll_internal (__nptr, __endptr, __base, 0);
}
__extension__ extern __inline unsigned long long int
strtoull (__const char * __restrict __nptr, char **__restrict __endptr,
int __base)
{
return __strtoull_internal (__nptr, __endptr, __base, 0);
}
extern __inline double
atof (__const char *__nptr)
{
return strtod (__nptr, (char **) ((void *)0));
}
extern __inline int
atoi (__const char *__nptr)
{
return (int) strtol (__nptr, (char **) ((void *)0), 10);
}
extern __inline long int
atol (__const char *__nptr)
{
return strtol (__nptr, (char **) ((void *)0), 10);
}
__extension__ extern __inline long long int
atoll (__const char *__nptr)
{
return strtoll (__nptr, (char **) ((void *)0), 10);
}
# 385 "/usr/include/stdlib.h" 3
extern char *l64a (long int __n) ;
extern long int a64l (__const char *__s) __attribute__ ((__pure__));
# 398 "/usr/include/stdlib.h" 3
extern long int random (void) ;
extern void srandom (unsigned int __seed) ;
extern char *initstate (unsigned int __seed, char *__statebuf,
size_t __statelen) ;
extern char *setstate (char *__statebuf) ;
struct random_data
{
int32_t *fptr;
int32_t *rptr;
int32_t *state;
int rand_type;
int rand_deg;
int rand_sep;
int32_t *end_ptr;
};
extern int random_r (struct random_data *__restrict __buf,
int32_t *__restrict __result) ;
extern int srandom_r (unsigned int __seed, struct random_data *__buf) ;
extern int initstate_r (unsigned int __seed, char *__restrict __statebuf,
size_t __statelen,
struct random_data *__restrict __buf) ;
extern int setstate_r (char *__restrict __statebuf,
struct random_data *__restrict __buf) ;
extern int rand (void) ;
extern void srand (unsigned int __seed) ;
extern int rand_r (unsigned int *__seed) ;
extern double drand48 (void) ;
extern double erand48 (unsigned short int __xsubi[3]) ;
extern long int lrand48 (void) ;
extern long int nrand48 (unsigned short int __xsubi[3]) ;
extern long int mrand48 (void) ;
extern long int jrand48 (unsigned short int __xsubi[3]) ;
extern void srand48 (long int __seedval) ;
extern unsigned short int *seed48 (unsigned short int __seed16v[3]) ;
extern void lcong48 (unsigned short int __param[7]) ;
struct drand48_data
{
unsigned short int __x[3];
unsigned short int __old_x[3];
unsigned short int __c;
unsigned short int __init;
unsigned long long int __a;
};
extern int drand48_r (struct drand48_data *__restrict __buffer,
double *__restrict __result) ;
extern int erand48_r (unsigned short int __xsubi[3],
struct drand48_data *__restrict __buffer,
double *__restrict __result) ;
extern int lrand48_r (struct drand48_data *__restrict __buffer,
long int *__restrict __result) ;
extern int nrand48_r (unsigned short int __xsubi[3],
struct drand48_data *__restrict __buffer,
long int *__restrict __result) ;
extern int mrand48_r (struct drand48_data *__restrict __buffer,
long int *__restrict __result) ;
extern int jrand48_r (unsigned short int __xsubi[3],
struct drand48_data *__restrict __buffer,
long int *__restrict __result) ;
extern int srand48_r (long int __seedval, struct drand48_data *__buffer)
;
extern int seed48_r (unsigned short int __seed16v[3],
struct drand48_data *__buffer) ;
extern int lcong48_r (unsigned short int __param[7],
struct drand48_data *__buffer) ;
# 537 "/usr/include/stdlib.h" 3
extern void *realloc (void *__ptr, size_t __size) __attribute__ ((__malloc__));
extern void free (void *__ptr) ;
extern void cfree (void *__ptr) ;
# 1 "/usr/include/alloca.h" 1 3
# 25 "/usr/include/alloca.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 26 "/usr/include/alloca.h" 2 3
extern void *alloca (size_t __size) ;
# 548 "/usr/include/stdlib.h" 2 3
extern void *valloc (size_t __size) __attribute__ ((__malloc__));
extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size)
__attribute__ ((__malloc__));
extern void abort (void) __attribute__ ((__noreturn__));
extern int atexit (void (*__func) (void)) ;
extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg)
;
extern void exit (int __status) __attribute__ ((__noreturn__));
extern void _Exit (int __status) __attribute__ ((__noreturn__));
extern char *getenv (__const char *__name) ;
extern char *__secure_getenv (__const char *__name) ;
extern int putenv (char *__string) ;
extern int setenv (__const char *__name, __const char *__value, int __replace)
;
extern int unsetenv (__const char *__name) ;
extern int clearenv (void) ;
# 624 "/usr/include/stdlib.h" 3
extern char *mktemp (char *__template) ;
extern int mkstemp (char *__template) ;
# 641 "/usr/include/stdlib.h" 3
extern int mkstemp64 (char *__template) ;
# 651 "/usr/include/stdlib.h" 3
extern char *mkdtemp (char *__template) ;
extern int system (__const char *__command) ;
extern char *canonicalize_file_name (__const char *__name) ;
# 673 "/usr/include/stdlib.h" 3
extern char *realpath (__const char *__restrict __name,
char *__restrict __resolved) ;
typedef int (*__compar_fn_t) (__const void *, __const void *);
typedef __compar_fn_t comparison_fn_t;
extern void *bsearch (__const void *__key, __const void *__base,
size_t __nmemb, size_t __size, __compar_fn_t __compar);
extern void qsort (void *__base, size_t __nmemb, size_t __size,
__compar_fn_t __compar);
extern int abs (int __x) __attribute__ ((__const__));
extern long int labs (long int __x) __attribute__ ((__const__));
__extension__ extern long long int llabs (long long int __x)
__attribute__ ((__const__));
extern div_t div (int __numer, int __denom)
__attribute__ ((__const__));
extern ldiv_t ldiv (long int __numer, long int __denom)
__attribute__ ((__const__));
__extension__ extern lldiv_t lldiv (long long int __numer,
long long int __denom)
__attribute__ ((__const__));
# 729 "/usr/include/stdlib.h" 3
extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign) ;
extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign) ;
extern char *gcvt (double __value, int __ndigit, char *__buf) ;
extern char *qecvt (long double __value, int __ndigit,
int *__restrict __decpt, int *__restrict __sign) ;
extern char *qfcvt (long double __value, int __ndigit,
int *__restrict __decpt, int *__restrict __sign) ;
extern char *qgcvt (long double __value, int __ndigit, char *__buf) ;
extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign, char *__restrict __buf,
size_t __len) ;
extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign, char *__restrict __buf,
size_t __len) ;
extern int qecvt_r (long double __value, int __ndigit,
int *__restrict __decpt, int *__restrict __sign,
char *__restrict __buf, size_t __len) ;
extern int qfcvt_r (long double __value, int __ndigit,
int *__restrict __decpt, int *__restrict __sign,
char *__restrict __buf, size_t __len) ;
extern int mblen (__const char *__s, size_t __n) ;
extern int mbtowc (wchar_t *__restrict __pwc,
__const char *__restrict __s, size_t __n) ;
extern int wctomb (char *__s, wchar_t __wchar) ;
extern size_t mbstowcs (wchar_t *__restrict __pwcs,
__const char *__restrict __s, size_t __n) ;
extern size_t wcstombs (char *__restrict __s,
__const wchar_t *__restrict __pwcs, size_t __n)
;
extern int rpmatch (__const char *__response) ;
# 809 "/usr/include/stdlib.h" 3
extern int getsubopt (char **__restrict __optionp,
char *__const *__restrict __tokens,
char **__restrict __valuep) ;
extern void setkey (__const char *__key) ;
extern int posix_openpt (int __oflag) ;
extern int grantpt (int __fd) ;
extern int unlockpt (int __fd) ;
extern char *ptsname (int __fd) ;
extern int ptsname_r (int __fd, char *__buf, size_t __buflen) ;
extern int getpt (void) ;
extern int getloadavg (double __loadavg[], int __nelem) ;
# 55 "sysdep.h" 2
# 1 "/usr/include/sys/time.h" 1 3
# 26 "/usr/include/sys/time.h" 3
# 1 "/usr/include/time.h" 1 3
# 27 "/usr/include/sys/time.h" 2 3
# 1 "/usr/include/bits/time.h" 1 3
# 29 "/usr/include/sys/time.h" 2 3
# 38 "/usr/include/sys/time.h" 3
# 56 "/usr/include/sys/time.h" 3
struct timezone
{
int tz_minuteswest;
int tz_dsttime;
};
typedef struct timezone *__restrict __timezone_ptr_t;
# 72 "/usr/include/sys/time.h" 3
extern int gettimeofday (struct timeval *__restrict __tv,
__timezone_ptr_t __tz) ;
extern int settimeofday (__const struct timeval *__tv,
__const struct timezone *__tz) ;
extern int adjtime (__const struct timeval *__delta,
struct timeval *__olddelta) ;
enum __itimer_which
{
ITIMER_REAL = 0,
ITIMER_VIRTUAL = 1,
ITIMER_PROF = 2
};
struct itimerval
{
struct timeval it_interval;
struct timeval it_value;
};
typedef enum __itimer_which __itimer_which_t;
extern int getitimer (__itimer_which_t __which,
struct itimerval *__value) ;
extern int setitimer (__itimer_which_t __which,
__const struct itimerval *__restrict __new,
struct itimerval *__restrict __old) ;
extern int utimes (__const char *__file, __const struct timeval __tvp[2])
;
# 169 "/usr/include/sys/time.h" 3
# 59 "sysdep.h" 2
# 1 "/usr/include/time.h" 1 3
# 30 "/usr/include/time.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 39 "/usr/include/time.h" 2 3
# 1 "/usr/include/bits/time.h" 1 3
# 43 "/usr/include/time.h" 2 3
# 118 "/usr/include/time.h" 3
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
long int tm_gmtoff;
__const char *tm_zone;
};
struct itimerspec
{
struct timespec it_interval;
struct timespec it_value;
};
struct sigevent;
# 163 "/usr/include/time.h" 3
extern clock_t clock (void) ;
extern time_t time (time_t *__timer) ;
extern double difftime (time_t __time1, time_t __time0)
__attribute__ ((__const__));
extern time_t mktime (struct tm *__tp) ;
extern size_t strftime (char *__restrict __s, size_t __maxsize,
__const char *__restrict __format,
__const struct tm *__restrict __tp) ;
extern char *strptime (__const char *__restrict __s,
__const char *__restrict __fmt, struct tm *__tp)
;
extern struct tm *gmtime (__const time_t *__timer) ;
extern struct tm *localtime (__const time_t *__timer) ;
extern struct tm *gmtime_r (__const time_t *__restrict __timer,
struct tm *__restrict __tp) ;
extern struct tm *localtime_r (__const time_t *__restrict __timer,
struct tm *__restrict __tp) ;
extern char *asctime (__const struct tm *__tp) ;
extern char *ctime (__const time_t *__timer) ;
extern char *asctime_r (__const struct tm *__restrict __tp,
char *__restrict __buf) ;
extern char *ctime_r (__const time_t *__restrict __timer,
char *__restrict __buf) ;
extern char *__tzname[2];
extern int __daylight;
extern long int __timezone;
extern char *tzname[2];
extern void tzset (void) ;
extern int daylight;
extern long int timezone;
extern int stime (__const time_t *__when) ;
# 271 "/usr/include/time.h" 3
extern time_t timegm (struct tm *__tp) ;
extern time_t timelocal (struct tm *__tp) ;
extern int dysize (int __year) __attribute__ ((__const__));
extern int nanosleep (__const struct timespec *__requested_time,
struct timespec *__remaining) ;
extern int clock_getres (clockid_t __clock_id, struct timespec *__res) ;
extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) ;
extern int clock_settime (clockid_t __clock_id, __const struct timespec *__tp)
;
extern int clock_nanosleep (clockid_t __clock_id, int __flags,
__const struct timespec *__req,
struct timespec *__rem) ;
extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) ;
extern int timer_create (clockid_t __clock_id,
struct sigevent *__restrict __evp,
timer_t *__restrict __timerid) ;
extern int timer_delete (timer_t __timerid) ;
extern int timer_settime (timer_t __timerid, int __flags,
__const struct itimerspec *__restrict __value,
struct itimerspec *__restrict __ovalue) ;
extern int timer_gettime (timer_t __timerid, struct itimerspec *__value)
;
extern int timer_getoverrun (timer_t __timerid) ;
# 342 "/usr/include/time.h" 3
extern int getdate_err;
extern struct tm *getdate (__const char *__string) ;
# 357 "/usr/include/time.h" 3
extern int getdate_r (__const char *__restrict __string,
struct tm *__restrict __resbufp) ;
# 60 "sysdep.h" 2
# 69 "sysdep.h"
# 1 "/usr/include/unistd.h" 1 3
# 28 "/usr/include/unistd.h" 3
# 175 "/usr/include/unistd.h" 3
# 1 "/usr/include/bits/posix_opt.h" 1 3
# 176 "/usr/include/unistd.h" 2 3
# 1 "/usr/include/bits/environments.h" 1 3
# 23 "/usr/include/bits/environments.h" 3
# 1 "/usr/include/bits/wordsize.h" 1 3
# 24 "/usr/include/bits/environments.h" 2 3
# 180 "/usr/include/unistd.h" 2 3
# 199 "/usr/include/unistd.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 200 "/usr/include/unistd.h" 2 3
# 240 "/usr/include/unistd.h" 3
typedef __intptr_t intptr_t;
typedef __socklen_t socklen_t;
# 260 "/usr/include/unistd.h" 3
extern int access (__const char *__name, int __type) ;
extern int euidaccess (__const char *__name, int __type) ;
# 290 "/usr/include/unistd.h" 3
extern __off_t lseek (int __fd, __off_t __offset, int __whence) ;
# 302 "/usr/include/unistd.h" 3
extern __off64_t lseek64 (int __fd, __off64_t __offset, int __whence) ;
extern int close (int __fd) ;
extern ssize_t read (int __fd, void *__buf, size_t __nbytes) ;
extern ssize_t write (int __fd, __const void *__buf, size_t __n) ;
extern ssize_t pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
;
extern ssize_t pwrite (int __fd, __const void *__buf, size_t __n,
__off_t __offset) ;
# 340 "/usr/include/unistd.h" 3
extern ssize_t pread64 (int __fd, void *__buf, size_t __nbytes,
__off64_t __offset) ;
extern ssize_t pwrite64 (int __fd, __const void *__buf, size_t __n,
__off64_t __offset) ;
extern int pipe (int __pipedes[2]) ;
# 362 "/usr/include/unistd.h" 3
extern unsigned int alarm (unsigned int __seconds) ;
# 371 "/usr/include/unistd.h" 3
extern unsigned int sleep (unsigned int __seconds) ;
extern __useconds_t ualarm (__useconds_t __value, __useconds_t __interval)
;
extern int usleep (__useconds_t __useconds) ;
extern int pause (void) ;
extern int chown (__const char *__file, __uid_t __owner, __gid_t __group)
;
extern int fchown (int __fd, __uid_t __owner, __gid_t __group) ;
extern int lchown (__const char *__file, __uid_t __owner, __gid_t __group)
;
extern int chdir (__const char *__path) ;
extern int fchdir (int __fd) ;
# 423 "/usr/include/unistd.h" 3
extern char *getcwd (char *__buf, size_t __size) ;
extern char *get_current_dir_name (void) ;
extern char *getwd (char *__buf) ;
extern int dup (int __fd) ;
extern int dup2 (int __fd, int __fd2) ;
extern char **__environ;
extern char **environ;
extern int execve (__const char *__path, char *__const __argv[],
char *__const __envp[]) ;
extern int fexecve (int __fd, char *__const __argv[], char *__const __envp[])
;
extern int execv (__const char *__path, char *__const __argv[]) ;
extern int execle (__const char *__path, __const char *__arg, ...) ;
extern int execl (__const char *__path, __const char *__arg, ...) ;
extern int execvp (__const char *__file, char *__const __argv[]) ;
extern int execlp (__const char *__file, __const char *__arg, ...) ;
extern int nice (int __inc) ;
extern void _exit (int __status) __attribute__ ((__noreturn__));
# 1 "/usr/include/bits/confname.h" 1 3
# 25 "/usr/include/bits/confname.h" 3
enum
{
_PC_LINK_MAX,
_PC_MAX_CANON,
_PC_MAX_INPUT,
_PC_NAME_MAX,
_PC_PATH_MAX,
_PC_PIPE_BUF,
_PC_CHOWN_RESTRICTED,
_PC_NO_TRUNC,
_PC_VDISABLE,
_PC_SYNC_IO,
_PC_ASYNC_IO,
_PC_PRIO_IO,
_PC_SOCK_MAXBUF,
_PC_FILESIZEBITS,
_PC_REC_INCR_XFER_SIZE,
_PC_REC_MAX_XFER_SIZE,
_PC_REC_MIN_XFER_SIZE,
_PC_REC_XFER_ALIGN,
_PC_ALLOC_SIZE_MIN,
_PC_SYMLINK_MAX
};
enum
{
_SC_ARG_MAX,
_SC_CHILD_MAX,
_SC_CLK_TCK,
_SC_NGROUPS_MAX,
_SC_OPEN_MAX,
_SC_STREAM_MAX,
_SC_TZNAME_MAX,
_SC_JOB_CONTROL,
_SC_SAVED_IDS,
_SC_REALTIME_SIGNALS,
_SC_PRIORITY_SCHEDULING,
_SC_TIMERS,
_SC_ASYNCHRONOUS_IO,
_SC_PRIORITIZED_IO,
_SC_SYNCHRONIZED_IO,
_SC_FSYNC,
_SC_MAPPED_FILES,
_SC_MEMLOCK,
_SC_MEMLOCK_RANGE,
_SC_MEMORY_PROTECTION,
_SC_MESSAGE_PASSING,
_SC_SEMAPHORES,
_SC_SHARED_MEMORY_OBJECTS,
_SC_AIO_LISTIO_MAX,
_SC_AIO_MAX,
_SC_AIO_PRIO_DELTA_MAX,
_SC_DELAYTIMER_MAX,
_SC_MQ_OPEN_MAX,
_SC_MQ_PRIO_MAX,
_SC_VERSION,
_SC_PAGESIZE,
_SC_RTSIG_MAX,
_SC_SEM_NSEMS_MAX,
_SC_SEM_VALUE_MAX,
_SC_SIGQUEUE_MAX,
_SC_TIMER_MAX,
_SC_BC_BASE_MAX,
_SC_BC_DIM_MAX,
_SC_BC_SCALE_MAX,
_SC_BC_STRING_MAX,
_SC_COLL_WEIGHTS_MAX,
_SC_EQUIV_CLASS_MAX,
_SC_EXPR_NEST_MAX,
_SC_LINE_MAX,
_SC_RE_DUP_MAX,
_SC_CHARCLASS_NAME_MAX,
_SC_2_VERSION,
_SC_2_C_BIND,
_SC_2_C_DEV,
_SC_2_FORT_DEV,
_SC_2_FORT_RUN,
_SC_2_SW_DEV,
_SC_2_LOCALEDEF,
_SC_PII,
_SC_PII_XTI,
_SC_PII_SOCKET,
_SC_PII_INTERNET,
_SC_PII_OSI,
_SC_POLL,
_SC_SELECT,
_SC_UIO_MAXIOV,
_SC_IOV_MAX = _SC_UIO_MAXIOV,
_SC_PII_INTERNET_STREAM,
_SC_PII_INTERNET_DGRAM,
_SC_PII_OSI_COTS,
_SC_PII_OSI_CLTS,
_SC_PII_OSI_M,
_SC_T_IOV_MAX,
_SC_THREADS,
_SC_THREAD_SAFE_FUNCTIONS,
_SC_GETGR_R_SIZE_MAX,
_SC_GETPW_R_SIZE_MAX,
_SC_LOGIN_NAME_MAX,
_SC_TTY_NAME_MAX,
_SC_THREAD_DESTRUCTOR_ITERATIONS,
_SC_THREAD_KEYS_MAX,
_SC_THREAD_STACK_MIN,
_SC_THREAD_THREADS_MAX,
_SC_THREAD_ATTR_STACKADDR,
_SC_THREAD_ATTR_STACKSIZE,
_SC_THREAD_PRIORITY_SCHEDULING,
_SC_THREAD_PRIO_INHERIT,
_SC_THREAD_PRIO_PROTECT,
_SC_THREAD_PROCESS_SHARED,
_SC_NPROCESSORS_CONF,
_SC_NPROCESSORS_ONLN,
_SC_PHYS_PAGES,
_SC_AVPHYS_PAGES,
_SC_ATEXIT_MAX,
_SC_PASS_MAX,
_SC_XOPEN_VERSION,
_SC_XOPEN_XCU_VERSION,
_SC_XOPEN_UNIX,
_SC_XOPEN_CRYPT,
_SC_XOPEN_ENH_I18N,
_SC_XOPEN_SHM,
_SC_2_CHAR_TERM,
_SC_2_C_VERSION,
_SC_2_UPE,
_SC_XOPEN_XPG2,
_SC_XOPEN_XPG3,
_SC_XOPEN_XPG4,
_SC_CHAR_BIT,
_SC_CHAR_MAX,
_SC_CHAR_MIN,
_SC_INT_MAX,
_SC_INT_MIN,
_SC_LONG_BIT,
_SC_WORD_BIT,
_SC_MB_LEN_MAX,
_SC_NZERO,
_SC_SSIZE_MAX,
_SC_SCHAR_MAX,
_SC_SCHAR_MIN,
_SC_SHRT_MAX,
_SC_SHRT_MIN,
_SC_UCHAR_MAX,
_SC_UINT_MAX,
_SC_ULONG_MAX,
_SC_USHRT_MAX,
_SC_NL_ARGMAX,
_SC_NL_LANGMAX,
_SC_NL_MSGMAX,
_SC_NL_NMAX,
_SC_NL_SETMAX,
_SC_NL_TEXTMAX,
_SC_XBS5_ILP32_OFF32,
_SC_XBS5_ILP32_OFFBIG,
_SC_XBS5_LP64_OFF64,
_SC_XBS5_LPBIG_OFFBIG,
_SC_XOPEN_LEGACY,
_SC_XOPEN_REALTIME,
_SC_XOPEN_REALTIME_THREADS,
_SC_ADVISORY_INFO,
_SC_BARRIERS,
_SC_BASE,
_SC_C_LANG_SUPPORT,
_SC_C_LANG_SUPPORT_R,
_SC_CLOCK_SELECTION,
_SC_CPUTIME,
_SC_THREAD_CPUTIME,
_SC_DEVICE_IO,
_SC_DEVICE_SPECIFIC,
_SC_DEVICE_SPECIFIC_R,
_SC_FD_MGMT,
_SC_FIFO,
_SC_PIPE,
_SC_FILE_ATTRIBUTES,
_SC_FILE_LOCKING,
_SC_FILE_SYSTEM,
_SC_MONOTONIC_CLOCK,
_SC_MULTI_PROCESS,
_SC_SINGLE_PROCESS,
_SC_NETWORKING,
_SC_READER_WRITER_LOCKS,
_SC_SPIN_LOCKS,
_SC_REGEXP,
_SC_REGEX_VERSION,
_SC_SHELL,
_SC_SIGNALS,
_SC_SPAWN,
_SC_SPORADIC_SERVER,
_SC_THREAD_SPORADIC_SERVER,
_SC_SYSTEM_DATABASE,
_SC_SYSTEM_DATABASE_R,
_SC_TIMEOUTS,
_SC_TYPED_MEMORY_OBJECTS,
_SC_USER_GROUPS,
_SC_USER_GROUPS_R,
_SC_2_PBS,
_SC_2_PBS_ACCOUNTING,
_SC_2_PBS_LOCATE,
_SC_2_PBS_MESSAGE,
_SC_2_PBS_TRACK,
_SC_SYMLOOP_MAX,
_SC_STREAMS,
_SC_2_PBS_CHECKPOINT,
_SC_V6_ILP32_OFF32,
_SC_V6_ILP32_OFFBIG,
_SC_V6_LP64_OFF64,
_SC_V6_LPBIG_OFFBIG,
_SC_HOST_NAME_MAX,
_SC_TRACE,
_SC_TRACE_EVENT_FILTER,
_SC_TRACE_INHERIT,
_SC_TRACE_LOG
};
enum
{
_CS_PATH,
_CS_LFS_CFLAGS = 1000,
_CS_LFS_LDFLAGS,
_CS_LFS_LIBS,
_CS_LFS_LINTFLAGS,
_CS_LFS64_CFLAGS,
_CS_LFS64_LDFLAGS,
_CS_LFS64_LIBS,
_CS_LFS64_LINTFLAGS,
_CS_XBS5_ILP32_OFF32_CFLAGS = 1100,
_CS_XBS5_ILP32_OFF32_LDFLAGS,
_CS_XBS5_ILP32_OFF32_LIBS,
_CS_XBS5_ILP32_OFF32_LINTFLAGS,
_CS_XBS5_ILP32_OFFBIG_CFLAGS,
_CS_XBS5_ILP32_OFFBIG_LDFLAGS,
_CS_XBS5_ILP32_OFFBIG_LIBS,
_CS_XBS5_ILP32_OFFBIG_LINTFLAGS,
_CS_XBS5_LP64_OFF64_CFLAGS,
_CS_XBS5_LP64_OFF64_LDFLAGS,
_CS_XBS5_LP64_OFF64_LIBS,
_CS_XBS5_LP64_OFF64_LINTFLAGS,
_CS_XBS5_LPBIG_OFFBIG_CFLAGS,
_CS_XBS5_LPBIG_OFFBIG_LDFLAGS,
_CS_XBS5_LPBIG_OFFBIG_LIBS,
_CS_XBS5_LPBIG_OFFBIG_LINTFLAGS,
_CS_POSIX_V6_ILP32_OFF32_CFLAGS,
_CS_POSIX_V6_ILP32_OFF32_LDFLAGS,
_CS_POSIX_V6_ILP32_OFF32_LIBS,
_CS_POSIX_V6_ILP32_OFF32_LINTFLAGS,
_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS,
_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS,
_CS_POSIX_V6_ILP32_OFFBIG_LIBS,
_CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS,
_CS_POSIX_V6_LP64_OFF64_CFLAGS,
_CS_POSIX_V6_LP64_OFF64_LDFLAGS,
_CS_POSIX_V6_LP64_OFF64_LIBS,
_CS_POSIX_V6_LP64_OFF64_LINTFLAGS,
_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS,
_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS,
_CS_POSIX_V6_LPBIG_OFFBIG_LIBS,
_CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS,
_CS_V6_WIDTH_RESTRICTED_ENVS,
};
# 501 "/usr/include/unistd.h" 2 3
extern long int pathconf (__const char *__path, int __name) ;
extern long int fpathconf (int __fd, int __name) ;
extern long int sysconf (int __name) __attribute__ ((__const__));
extern size_t confstr (int __name, char *__buf, size_t __len) ;
extern __pid_t getpid (void) ;
extern __pid_t getppid (void) ;
extern __pid_t getpgrp (void) ;
# 536 "/usr/include/unistd.h" 3
extern __pid_t __getpgid (__pid_t __pid) ;
extern __pid_t getpgid (__pid_t __pid) ;
extern int setpgid (__pid_t __pid, __pid_t __pgid) ;
# 562 "/usr/include/unistd.h" 3
extern int setpgrp (void) ;
# 580 "/usr/include/unistd.h" 3
extern __pid_t setsid (void) ;
extern __pid_t getsid (__pid_t __pid) ;
extern __uid_t getuid (void) ;
extern __uid_t geteuid (void) ;
extern __gid_t getgid (void) ;
extern __gid_t getegid (void) ;
extern int getgroups (int __size, __gid_t __list[]) ;
extern int group_member (__gid_t __gid) ;
extern int setuid (__uid_t __uid) ;
extern int setreuid (__uid_t __ruid, __uid_t __euid) ;
extern int seteuid (__uid_t __uid) ;
extern int setgid (__gid_t __gid) ;
extern int setregid (__gid_t __rgid, __gid_t __egid) ;
extern int setegid (__gid_t __gid) ;
extern __pid_t fork (void) ;
extern __pid_t vfork (void) ;
extern char *ttyname (int __fd) ;
extern int ttyname_r (int __fd, char *__buf, size_t __buflen) ;
extern int isatty (int __fd) ;
extern int ttyslot (void) ;
extern int link (__const char *__from, __const char *__to) ;
extern int symlink (__const char *__from, __const char *__to) ;
extern int readlink (__const char *__restrict __path, char *__restrict __buf,
size_t __len) ;
extern int unlink (__const char *__name) ;
extern int rmdir (__const char *__path) ;
extern __pid_t tcgetpgrp (int __fd) ;
extern int tcsetpgrp (int __fd, __pid_t __pgrp_id) ;
extern char *getlogin (void) ;
extern int getlogin_r (char *__name, size_t __name_len) ;
extern int setlogin (__const char *__name) ;
# 726 "/usr/include/unistd.h" 3
# 1 "../include/getopt.h" 1 3
# 36 "../include/getopt.h" 3
extern char *optarg;
# 50 "../include/getopt.h" 3
extern int optind;
extern int opterr;
extern int optopt;
# 82 "../include/getopt.h" 3
struct option
{
const char *name;
int has_arg;
int *flag;
int val;
};
# 112 "../include/getopt.h" 3
extern int getopt (int argc, char *const *argv, const char *shortopts);
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
const struct option *longopts, int *longind);
extern int getopt_long_only (int argc, char *const *argv,
const char *shortopts,
const struct option *longopts, int *longind);
extern int _getopt_internal (int argc, char *const *argv,
const char *shortopts,
const struct option *longopts, int *longind,
int long_only);
# 727 "/usr/include/unistd.h" 2 3
extern int gethostname (char *__name, size_t __len) ;
extern int sethostname (__const char *__name, size_t __len) ;
extern int sethostid (long int __id) ;
extern int getdomainname (char *__name, size_t __len) ;
extern int setdomainname (__const char *__name, size_t __len) ;
extern int vhangup (void) ;
extern int revoke (__const char *__file) ;
extern int profil (unsigned short int *__sample_buffer, size_t __size,
size_t __offset, unsigned int __scale) ;
extern int acct (__const char *__name) ;
extern char *getusershell (void) ;
extern void endusershell (void) ;
extern void setusershell (void) ;
extern int daemon (int __nochdir, int __noclose) ;
extern int chroot (__const char *__path) ;
extern char *getpass (__const char *__prompt) ;
extern int fsync (int __fd) ;
extern long int gethostid (void) ;
extern void sync (void) ;
extern int getpagesize (void) __attribute__ ((__const__));
extern int truncate (__const char *__file, __off_t __length) ;
# 836 "/usr/include/unistd.h" 3
extern int truncate64 (__const char *__file, __off64_t __length) ;
extern int ftruncate (int __fd, __off_t __length) ;
# 851 "/usr/include/unistd.h" 3
extern int ftruncate64 (int __fd, __off64_t __length) ;
extern int getdtablesize (void) ;
# 866 "/usr/include/unistd.h" 3
extern int brk (void *__addr) ;
extern void *sbrk (intptr_t __delta) ;
# 887 "/usr/include/unistd.h" 3
extern long int syscall (long int __sysno, ...) ;
# 907 "/usr/include/unistd.h" 3
extern int lockf (int __fd, int __cmd, __off_t __len) ;
# 917 "/usr/include/unistd.h" 3
extern int lockf64 (int __fd, int __cmd, __off64_t __len) ;
# 938 "/usr/include/unistd.h" 3
extern int fdatasync (int __fildes) ;
extern char *crypt (__const char *__key, __const char *__salt) ;
extern void encrypt (char *__block, int __edflag) ;
extern void swab (__const void *__restrict __from, void *__restrict __to,
ssize_t __n) ;
extern char *ctermid (char *__s) ;
# 983 "/usr/include/unistd.h" 3
extern int pthread_atfork (void (*__prepare) (void),
void (*__parent) (void),
void (*__child) (void)) ;
# 70 "sysdep.h" 2
# 1 "../include/fopen-same.h" 1
# 76 "sysdep.h" 2
# 1 "/usr/include/fcntl.h" 1 3
# 29 "/usr/include/fcntl.h" 3
# 1 "/usr/include/bits/fcntl.h" 1 3
# 134 "/usr/include/bits/fcntl.h" 3
struct flock
{
short int l_type;
short int l_whence;
__off_t l_start;
__off_t l_len;
__pid_t l_pid;
};
struct flock64
{
short int l_type;
short int l_whence;
__off64_t l_start;
__off64_t l_len;
__pid_t l_pid;
};
# 34 "/usr/include/fcntl.h" 2 3
# 60 "/usr/include/fcntl.h" 3
extern int fcntl (int __fd, int __cmd, ...) ;
extern int open (__const char *__file, int __oflag, ...) ;
# 76 "/usr/include/fcntl.h" 3
extern int open64 (__const char *__file, int __oflag, ...) ;
extern int creat (__const char *__file, __mode_t __mode) ;
# 93 "/usr/include/fcntl.h" 3
extern int creat64 (__const char *__file, __mode_t __mode) ;
# 130 "/usr/include/fcntl.h" 3
extern int posix_fadvise (int __fd, __off_t __offset, size_t __len,
int __advise) ;
# 142 "/usr/include/fcntl.h" 3
extern int posix_fadvise64 (int __fd, __off64_t __offset, size_t __len,
int __advise) ;
extern int posix_fallocate (int __fd, __off_t __offset, size_t __len) ;
# 160 "/usr/include/fcntl.h" 3
extern int posix_fallocate64 (int __fd, __off64_t __offset, size_t __len)
;
# 80 "sysdep.h" 2
# 106 "sysdep.h"
# 1 "../include/filenames.h" 1
# 107 "sysdep.h" 2
# 135 "sysdep.h"
# 1 "/usr/include/libintl.h" 1 3
# 29 "/usr/include/libintl.h" 3
extern char *gettext (__const char *__msgid) ;
extern char *dgettext (__const char *__domainname, __const char *__msgid)
;
extern char *__dgettext (__const char *__domainname, __const char *__msgid)
__attribute__ ((__format_arg__ (2)));
extern char *dcgettext (__const char *__domainname,
__const char *__msgid, int __category) ;
extern char *__dcgettext (__const char *__domainname,
__const char *__msgid, int __category)
__attribute__ ((__format_arg__ (2)));
extern char *ngettext (__const char *__msgid1, __const char *__msgid2,
unsigned long int __n)
__attribute__ ((__format_arg__ (1)));
extern char *dngettext (__const char *__domainname, __const char *__msgid1,
__const char *__msgid2, unsigned long int __n)
__attribute__ ((__format_arg__ (2)));
extern char *dcngettext (__const char *__domainname, __const char *__msgid1,
__const char *__msgid2, unsigned long int __n,
int __category)
__attribute__ ((__format_arg__ (2)));
extern char *textdomain (__const char *__domainname) ;
extern char *bindtextdomain (__const char *__domainname,
__const char *__dirname) ;
extern char *bind_textdomain_codeset (__const char *__domainname,
__const char *__codeset) ;
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 94 "/usr/include/libintl.h" 2 3
# 1 "/usr/include/locale.h" 1 3
# 29 "/usr/include/locale.h" 3
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 30 "/usr/include/locale.h" 2 3
# 1 "/usr/include/bits/locale.h" 1 3
# 27 "/usr/include/bits/locale.h" 3
enum
{
__LC_CTYPE = 0,
__LC_NUMERIC = 1,
__LC_TIME = 2,
__LC_COLLATE = 3,
__LC_MONETARY = 4,
__LC_MESSAGES = 5,
__LC_ALL = 6,
__LC_PAPER = 7,
__LC_NAME = 8,
__LC_ADDRESS = 9,
__LC_TELEPHONE = 10,
__LC_MEASUREMENT = 11,
__LC_IDENTIFICATION = 12
};
# 31 "/usr/include/locale.h" 2 3
# 52 "/usr/include/locale.h" 3
struct lconv
{
char *decimal_point;
char *thousands_sep;
char *grouping;
char *int_curr_symbol;
char *currency_symbol;
char *mon_decimal_point;
char *mon_thousands_sep;
char *mon_grouping;
char *positive_sign;
char *negative_sign;
char int_frac_digits;
char frac_digits;
char p_cs_precedes;
char p_sep_by_space;
char n_cs_precedes;
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
char int_p_cs_precedes;
char int_p_sep_by_space;
char int_n_cs_precedes;
char int_n_sep_by_space;
char int_p_sign_posn;
char int_n_sign_posn;
# 119 "/usr/include/locale.h" 3
};
extern char *setlocale (int __category, __const char *__locale) ;
extern struct lconv *localeconv (void) ;
# 149 "/usr/include/locale.h" 3
extern __locale_t __newlocale (int __category_mask, __const char *__locale,
__locale_t __base) ;
extern __locale_t __duplocale (__locale_t __dataset) ;
extern void __freelocale (__locale_t __dataset) ;
# 97 "/usr/include/libintl.h" 2 3
# 114 "/usr/include/libintl.h" 3
# 136 "sysdep.h" 2
# 69 "elfcode.h" 2
# 1 "../include/libiberty.h" 1
# 46 "../include/libiberty.h"
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stddef.h" 1 3
# 47 "../include/libiberty.h" 2
# 1 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdarg.h" 1 3
# 110 "/usr/lib/gcc-lib/alpha-unknown-linux-gnu/3.1/include/stdarg.h" 3
typedef __gnuc_va_list va_list;
# 49 "../include/libiberty.h" 2
extern char **buildargv (const char *) __attribute__ ((__malloc__));
extern void freeargv (char **);
extern char **dupargv (char **) __attribute__ ((__malloc__));
# 77 "../include/libiberty.h"
extern char *basename (const char *);
# 86 "../include/libiberty.h"
extern const char *lbasename (const char *);
extern char *concat (const char *, ...) __attribute__ ((__malloc__));
# 101 "../include/libiberty.h"
extern char *reconcat (char *, const char *, ...) __attribute__ ((__malloc__));
extern unsigned long concat_length (const char *, ...);
extern char *concat_copy (char *, const char *, ...);
extern char *concat_copy2 (const char *, ...);
extern char *libiberty_concat_ptr;
# 137 "../include/libiberty.h"
extern int fdmatch (int fd1, int fd2);
extern char * getpwd (void);
extern long get_run_time (void);
extern char *choose_temp_base (void) __attribute__ ((__malloc__));
extern char *make_temp_file (const char *) __attribute__ ((__malloc__));
extern const char *spaces (int count);
extern int errno_max (void);
extern const char *strerrno (int);
extern int strtoerrno (const char *);
extern char *xstrerror (int);
extern int signo_max (void);
# 193 "../include/libiberty.h"
extern const char *strsigno (int);
extern int strtosigno (const char *);
extern int xatexit (void (*fn) (void));
extern void xexit (int status) __attribute__ ((__noreturn__));
extern void xmalloc_set_program_name (const char *);
extern void xmalloc_failed (size_t) __attribute__ ((__noreturn__));
extern void * xmalloc (size_t) __attribute__ ((__malloc__));
extern void * xrealloc (void *, size_t);
extern void * xcalloc (size_t, size_t) __attribute__ ((__malloc__));
extern char *xstrdup (const char *) __attribute__ ((__malloc__));
extern void * xmemdup (const void *, size_t, size_t) __attribute__ ((__malloc__));
extern const char _hex_value[256];
extern void hex_init (void);
# 260 "../include/libiberty.h"
extern int pexecute (const char *, char * const *, const char *, const char *, char **, char **, int);
extern int pwait (int, int *, int);
extern int asprintf (char **, const char *, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
extern int vasprintf (char **, const char *, va_list)
__attribute__ ((__format__ (__printf__, 2, 0)));
# 286 "../include/libiberty.h"
extern void * C_alloca (size_t);
# 70 "elfcode.h" 2
# 1 "../include/bfdlink.h" 1
# 26 "../include/bfdlink.h"
enum bfd_link_strip
{
strip_none,
strip_debugger,
strip_some,
strip_all
};
enum bfd_link_discard
{
discard_sec_merge,
discard_none,
discard_l,
discard_all
};
enum bfd_link_hash_table_type
{
bfd_link_generic_hash_table,
bfd_link_elf_hash_table
};
enum bfd_link_hash_type
{
bfd_link_hash_new,
bfd_link_hash_undefined,
bfd_link_hash_undefweak,
bfd_link_hash_defined,
bfd_link_hash_defweak,
bfd_link_hash_common,
bfd_link_hash_indirect,
bfd_link_hash_warning
};
struct bfd_link_hash_entry
{
struct bfd_hash_entry root;
enum bfd_link_hash_type type;
# 97 "../include/bfdlink.h"
struct bfd_link_hash_entry *next;
union
{
struct
{
bfd *abfd;
} undef;
struct
{
bfd_vma value;
asection *section;
} def;
struct
{
struct bfd_link_hash_entry *link;
const char *warning;
} i;
struct
{
# 131 "../include/bfdlink.h"
bfd_size_type size;
struct bfd_link_hash_common_entry
{
unsigned int alignment_power;
asection *section;
} *p;
} c;
} u;
};
struct bfd_link_hash_table
{
struct bfd_hash_table table;
const bfd_target *creator;
struct bfd_link_hash_entry *undefs;
struct bfd_link_hash_entry *undefs_tail;
enum bfd_link_hash_table_type type;
};
extern struct bfd_link_hash_entry *bfd_link_hash_lookup
(struct bfd_link_hash_table *, const char *, boolean create, boolean copy, boolean follow);
extern struct bfd_link_hash_entry *bfd_wrapped_link_hash_lookup
(bfd *, struct bfd_link_info *, const char *, boolean, boolean, boolean);
extern void bfd_link_hash_traverse
(struct bfd_link_hash_table *, boolean (*) (struct bfd_link_hash_entry *, void *), void *);
extern void bfd_link_add_undef
(struct bfd_link_hash_table *, struct bfd_link_hash_entry *);
struct bfd_link_info
{
const struct bfd_link_callbacks *callbacks;
boolean relocateable;
boolean emitrelocations;
boolean task_link;
boolean shared;
boolean symbolic;
boolean export_dynamic;
boolean static_link;
boolean traditional_format;
boolean optimize;
boolean no_undefined;
# 233 "../include/bfdlink.h"
boolean allow_shlib_undefined;
enum bfd_link_strip strip;
enum bfd_link_discard discard;
boolean keep_memory;
bfd *input_bfds;
asection *create_object_symbols_section;
struct bfd_link_hash_table *hash;
struct bfd_hash_table *keep_hash;
boolean notice_all;
struct bfd_hash_table *notice_hash;
struct bfd_hash_table *wrap_hash;
void * base_file;
int mpc860c0;
const char *init_function;
const char *fini_function;
boolean new_dtags;
bfd_vma flags;
bfd_vma flags_1;
boolean pei386_auto_import;
boolean combreloc;
boolean nocopyreloc;
unsigned int spare_dynamic_tags;
};
# 312 "../include/bfdlink.h"
struct bfd_link_callbacks
{
boolean (*add_archive_element) (struct bfd_link_info *, bfd *abfd, const char *name);
# 327 "../include/bfdlink.h"
boolean (*multiple_definition) (struct bfd_link_info *, const char *name, bfd *obfd, asection *osec, bfd_vma oval, bfd *nbfd, asection *nsec, bfd_vma nval);
# 346 "../include/bfdlink.h"
boolean (*multiple_common) (struct bfd_link_info *, const char *name, bfd *obfd, enum bfd_link_hash_type otype, bfd_vma osize, bfd *nbfd, enum bfd_link_hash_type ntype, bfd_vma nsize);
# 360 "../include/bfdlink.h"
boolean (*add_to_set) (struct bfd_link_info *, struct bfd_link_hash_entry *entry, bfd_reloc_code_real_type reloc, bfd *abfd, asection *sec, bfd_vma value);
# 370 "../include/bfdlink.h"
boolean (*constructor) (struct bfd_link_info *, boolean constructor, const char *name, bfd *abfd, asection *sec, bfd_vma value);
# 381 "../include/bfdlink.h"
boolean (*warning) (struct bfd_link_info *, const char *warning, const char *symbol, bfd *abfd, asection *section, bfd_vma address);
# 390 "../include/bfdlink.h"
boolean (*undefined_symbol) (struct bfd_link_info *, const char *name, bfd *abfd, asection *section, bfd_vma address, boolean fatal);
# 402 "../include/bfdlink.h"
boolean (*reloc_overflow) (struct bfd_link_info *, const char *name, const char *reloc_name, bfd_vma addend, bfd *abfd, asection *section, bfd_vma address);
# 414 "../include/bfdlink.h"
boolean (*reloc_dangerous) (struct bfd_link_info *, const char *message, bfd *abfd, asection *section, bfd_vma address);
# 424 "../include/bfdlink.h"
boolean (*unattached_reloc) (struct bfd_link_info *, const char *name, bfd *abfd, asection *section, bfd_vma address);
boolean (*notice) (struct bfd_link_info *, const char *name, bfd *abfd, asection *section, bfd_vma address);
};
enum bfd_link_order_type
{
bfd_undefined_link_order,
bfd_indirect_link_order,
bfd_fill_link_order,
bfd_data_link_order,
bfd_section_reloc_link_order,
bfd_symbol_reloc_link_order
};
struct bfd_link_order
{
struct bfd_link_order *next;
enum bfd_link_order_type type;
bfd_vma offset;
bfd_size_type size;
union
{
struct
{
asection *section;
} indirect;
struct
{
unsigned int value;
} fill;
struct
{
bfd_byte *contents;
} data;
struct
{
struct bfd_link_order_reloc *p;
} reloc;
} u;
};
# 510 "../include/bfdlink.h"
struct bfd_link_order_reloc
{
bfd_reloc_code_real_type reloc;
union
{
asection *section;
const char *name;
} u;
bfd_vma addend;
};
extern struct bfd_link_order *bfd_new_link_order (bfd *, asection *);
# 544 "../include/bfdlink.h"
struct bfd_elf_version_expr
{
struct bfd_elf_version_expr *next;
const char *pattern;
int (*match) (struct bfd_elf_version_expr *, const char *);
};
struct bfd_elf_version_deps
{
struct bfd_elf_version_deps *next;
struct bfd_elf_version_tree *version_needed;
};
struct bfd_elf_version_tree
{
struct bfd_elf_version_tree *next;
const char *name;
unsigned int vernum;
struct bfd_elf_version_expr *globals;
struct bfd_elf_version_expr *locals;
struct bfd_elf_version_deps *deps;
unsigned int name_indx;
int used;
};
# 71 "elfcode.h" 2
# 1 "libbfd.h" 1
# 49 "libbfd.h"
struct bfd_in_memory
{
bfd_size_type size;
bfd_byte *buffer;
};
struct artdata {
file_ptr first_file_filepos;
struct ar_cache *cache;
bfd *archive_head;
carsym *symdefs;
symindex symdef_count;
char *extended_names;
long armap_timestamp;
file_ptr armap_datepos;
void * tdata;
};
struct areltdata {
char * arch_header;
unsigned int parsed_size;
char *filename;
};
extern void * bfd_malloc (bfd_size_type);
extern void * bfd_realloc (void *, bfd_size_type);
extern void * bfd_zmalloc (bfd_size_type);
extern bfd_error_handler_type _bfd_error_handler;
extern void * bfd_alloc (bfd *, bfd_size_type);
extern void * bfd_zalloc (bfd *, bfd_size_type);
extern void bfd_release (bfd *, void *);
bfd * _bfd_create_empty_archive_element_shell (bfd *obfd);
bfd * _bfd_look_for_bfd_in_cache (bfd *, file_ptr);
boolean _bfd_add_bfd_to_archive_cache (bfd *, file_ptr, bfd *);
boolean _bfd_generic_mkarchive (bfd *abfd);
const bfd_target *bfd_generic_archive_p (bfd *abfd);
boolean bfd_slurp_armap (bfd *abfd);
boolean bfd_slurp_bsd_armap_f2 (bfd *abfd);
boolean _bfd_slurp_extended_name_table (bfd *abfd);
extern boolean _bfd_construct_extended_name_table
(bfd *, boolean, char **, bfd_size_type *);
boolean _bfd_write_archive_contents (bfd *abfd);
boolean _bfd_compute_and_write_armap (bfd *, unsigned int elength);
bfd *_bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos);
extern bfd *_bfd_generic_get_elt_at_index (bfd *, symindex);
bfd * _bfd_new_bfd (void);
boolean bfd_false (bfd *ignore);
boolean bfd_true (bfd *ignore);
void * bfd_nullvoidptr (bfd *ignore);
int bfd_0 (bfd *ignore);
unsigned int bfd_0u (bfd *ignore);
long bfd_0l (bfd *ignore);
long _bfd_n1 (bfd *ignore);
void bfd_void (bfd *ignore);
bfd *_bfd_new_bfd_contained_in (bfd *);
const bfd_target *_bfd_dummy_target (bfd *abfd);
void bfd_dont_truncate_arname (bfd *abfd, const char *filename, char *hdr);
void bfd_bsd_truncate_arname (bfd *abfd, const char *filename, char *hdr);
void bfd_gnu_truncate_arname (bfd *abfd, const char *filename, char *hdr);
boolean bsd_write_armap (bfd *arch, unsigned int elength, struct orl *map, unsigned int orl_count, int stridx);
boolean coff_write_armap (bfd *arch, unsigned int elength, struct orl *map, unsigned int orl_count, int stridx);
extern void * _bfd_generic_read_ar_hdr (bfd *);
extern void * _bfd_generic_read_ar_hdr_mag (bfd *, const char *);
bfd * bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file);
int bfd_generic_stat_arch_elt (bfd *, struct stat *);
# 165 "libbfd.h"
extern boolean _bfd_generic_get_section_contents
(bfd *, asection *, void *, file_ptr, bfd_size_type);
extern boolean _bfd_generic_get_section_contents_in_window
(bfd *, asection *, bfd_window *, file_ptr, bfd_size_type);
# 189 "libbfd.h"
extern char *_bfd_nocore_core_file_failing_command (bfd *);
extern int _bfd_nocore_core_file_failing_signal (bfd *);
extern boolean _bfd_nocore_core_file_matches_executable_p
(bfd *, bfd *);
# 222 "libbfd.h"
extern boolean _bfd_archive_bsd_construct_extended_name_table
(bfd *, char **, bfd_size_type *, const char **);
# 232 "libbfd.h"
extern boolean _bfd_archive_bsd_update_armap_timestamp (bfd *);
extern boolean _bfd_archive_coff_construct_extended_name_table
(bfd *, char **, bfd_size_type *, const char **);
# 306 "libbfd.h"
extern boolean _bfd_generic_set_section_contents
(bfd *, asection *, void *, file_ptr, bfd_size_type);
# 352 "libbfd.h"
extern boolean bfd_generic_is_local_label_name (bfd *, const char *);
extern long _bfd_generic_read_minisymbols
(bfd *, boolean, void * *, unsigned int *);
extern asymbol *_bfd_generic_minisymbol_to_symbol
(bfd *, boolean, const void *, asymbol *);
extern boolean _bfd_stab_section_find_nearest_line
(bfd *, asymbol **, asection *, bfd_vma, boolean *, const char **, const char **, unsigned int *, void * *);
extern boolean _bfd_dwarf1_find_nearest_line
(bfd *, asection *, asymbol **, bfd_vma, const char **, const char **, unsigned int *);
extern boolean _bfd_dwarf2_find_nearest_line
(bfd *, asection *, asymbol **, bfd_vma, const char **, const char **, unsigned int *, unsigned int, void * *);
extern struct bfd_hash_entry *_bfd_link_hash_newfunc
(struct bfd_hash_entry *entry, struct bfd_hash_table *table, const char *string);
extern boolean _bfd_link_hash_table_init
(struct bfd_link_hash_table *, bfd *, struct bfd_hash_entry *(*) (struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
extern struct bfd_link_hash_table *_bfd_generic_link_hash_table_create
(bfd *);
extern boolean _bfd_generic_link_add_symbols
(bfd *, struct bfd_link_info *);
extern boolean _bfd_generic_link_add_symbols_collect
(bfd *, struct bfd_link_info *);
extern boolean _bfd_generic_link_add_archive_symbols
(bfd *, struct bfd_link_info *, boolean (*checkfn) (bfd *, struct bfd_link_info *, boolean *));
typedef struct bfd_link_hash_entry _bfd_link_hash_entry;
extern boolean _bfd_generic_link_add_one_symbol
(struct bfd_link_info *, bfd *, const char *name, flagword, asection *, bfd_vma, const char *, boolean copy, boolean constructor, struct bfd_link_hash_entry **);
extern boolean _bfd_generic_final_link
(bfd *, struct bfd_link_info *);
extern boolean _bfd_generic_link_split_section
(bfd *, struct sec *);
extern boolean _bfd_generic_reloc_link_order
(bfd *, struct bfd_link_info *, asection *, struct bfd_link_order *);
extern boolean _bfd_default_link_order
(bfd *, struct bfd_link_info *, asection *, struct bfd_link_order *);
extern unsigned int _bfd_count_link_order_relocs
(struct bfd_link_order *);
extern bfd_reloc_status_type _bfd_final_link_relocate
(reloc_howto_type *, bfd *, asection *, bfd_byte *, bfd_vma, bfd_vma, bfd_vma);
extern bfd_reloc_status_type _bfd_relocate_contents
(reloc_howto_type *, bfd *, bfd_vma, bfd_byte *);
extern boolean _bfd_link_section_stabs
(bfd *, void * *, asection *, asection *, void * *);
extern boolean _bfd_discard_section_stabs
(bfd *, asection *, void *, boolean (*) (bfd_vma, void *), void *);
extern boolean _bfd_write_section_stabs
(bfd *, void * *, asection *, void * *, bfd_byte *);
extern boolean _bfd_write_stab_strings (bfd *, void * *);
extern bfd_vma _bfd_stab_section_offset
(bfd *, void * *, asection *, void * *, bfd_vma);
extern boolean _bfd_merge_section
(bfd *, void * *, asection *, void * *);
extern boolean _bfd_merge_sections
(bfd *, void *);
extern boolean _bfd_write_merged_section
(bfd *, asection *, void *);
extern bfd_vma _bfd_merged_section_offset
(bfd *, asection **, void *, bfd_vma, bfd_vma);
extern struct bfd_strtab_hash *_bfd_stringtab_init (void);
extern struct bfd_strtab_hash *_bfd_xcoff_stringtab_init (void);
extern void _bfd_stringtab_free (struct bfd_strtab_hash *);
extern bfd_size_type _bfd_stringtab_size (struct bfd_strtab_hash *);
extern bfd_size_type _bfd_stringtab_add
(struct bfd_strtab_hash *, const char *, boolean hash, boolean copy);
extern boolean _bfd_stringtab_emit (bfd *, struct bfd_strtab_hash *);
extern boolean _bfd_generic_verify_endian_match (bfd *, bfd *);
# 529 "libbfd.h"
void bfd_assert (const char*,int);
extern void _bfd_abort (const char *, int, const char *)
__attribute__ ((__noreturn__));
# 548 "libbfd.h"
FILE * bfd_cache_lookup_worker (bfd *);
extern bfd *bfd_last_cache;
extern const bfd_target * const *bfd_target_vector;
extern const bfd_target *bfd_default_vector[];
struct ecoff_find_line;
extern boolean _bfd_ecoff_locate_line
(bfd *, asection *, bfd_vma, struct ecoff_debug_info * const, const struct ecoff_debug_swap * const, struct ecoff_find_line *, const char **, const char **, unsigned int *);
extern boolean _bfd_ecoff_get_accumulated_pdr (void *, bfd_byte *);
extern boolean _bfd_ecoff_get_accumulated_sym (void *, bfd_byte *);
extern boolean _bfd_ecoff_get_accumulated_ss (void *, bfd_byte *);
extern bfd_vma _bfd_get_gp_value (bfd *);
extern void _bfd_set_gp_value (bfd *, bfd_vma);
extern boolean _bfd_sh_align_load_span
(bfd *, asection *, bfd_byte *, boolean (*) (bfd *, asection *, void *, bfd_byte *, bfd_vma), void *, bfd_vma **, bfd_vma *, bfd_vma, bfd_vma, boolean *);
void
bfd_write_bigendian_4byte_int (bfd *, unsigned int);
unsigned int
bfd_log2 (bfd_vma x);
extern bfd *bfd_last_cache;
boolean
bfd_cache_init (bfd *abfd);
boolean
bfd_cache_close (bfd *abfd);
FILE*
bfd_open_file (bfd *abfd);
FILE *
bfd_cache_lookup_worker (bfd *abfd);
# 1148 "libbfd.h"
reloc_howto_type *
bfd_default_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code);
boolean
bfd_generic_relax_section (bfd *abfd, asection *section, struct bfd_link_info *, boolean *);
boolean
bfd_generic_gc_sections (bfd *, struct bfd_link_info *);
boolean
bfd_generic_merge_sections (bfd *, struct bfd_link_info *);
bfd_byte *
bfd_generic_get_relocated_section_contents (bfd *abfd, struct bfd_link_info *link_info, struct bfd_link_order *link_order, bfd_byte *data, boolean relocateable, asymbol **symbols);
extern const bfd_arch_info_type bfd_default_arch_struct;
boolean
bfd_default_set_arch_mach (bfd *abfd, enum bfd_architecture arch, unsigned long mach);
const bfd_arch_info_type *
bfd_default_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b);
boolean
bfd_default_scan (const struct bfd_arch_info *info, const char *string);
struct elf_internal_shdr *
bfd_elf_find_section (bfd *abfd, char *name);
# 72 "elfcode.h" 2
# 1 "elf-bfd.h" 1
# 25 "elf-bfd.h"
# 1 "../include/elf/common.h" 1
# 26 "elf-bfd.h" 2
# 1 "../include/elf/internal.h" 1
# 44 "../include/elf/internal.h"
typedef struct elf_internal_ehdr {
unsigned char e_ident[16];
bfd_vma e_entry;
bfd_size_type e_phoff;
bfd_size_type e_shoff;
unsigned long e_version;
unsigned long e_flags;
unsigned short e_type;
unsigned short e_machine;
unsigned short e_ehsize;
unsigned short e_phentsize;
unsigned short e_phnum;
unsigned short e_shentsize;
unsigned short e_shnum;
unsigned short e_shstrndx;
} Elf_Internal_Ehdr;
# 68 "../include/elf/internal.h"
struct elf_internal_phdr {
unsigned long p_type;
unsigned long p_flags;
bfd_vma p_offset;
bfd_vma p_vaddr;
bfd_vma p_paddr;
bfd_vma p_filesz;
bfd_vma p_memsz;
bfd_vma p_align;
};
typedef struct elf_internal_phdr Elf_Internal_Phdr;
typedef struct elf_internal_shdr {
unsigned int sh_name;
unsigned int sh_type;
bfd_vma sh_flags;
bfd_vma sh_addr;
bfd_size_type sh_size;
bfd_size_type sh_entsize;
unsigned long sh_link;
unsigned long sh_info;
file_ptr sh_offset;
unsigned int sh_addralign;
asection * bfd_section;
unsigned char *contents;
} Elf_Internal_Shdr;
# 111 "../include/elf/internal.h"
struct elf_internal_sym {
bfd_vma st_value;
bfd_vma st_size;
unsigned long st_name;
unsigned char st_info;
unsigned char st_other;
unsigned short st_shndx;
};
typedef struct elf_internal_sym Elf_Internal_Sym;
# 129 "../include/elf/internal.h"
typedef struct elf_internal_note {
unsigned long namesz;
unsigned long descsz;
unsigned long type;
char * namedata;
char * descdata;
bfd_vma descpos;
} Elf_Internal_Note;
typedef struct elf_internal_rel {
bfd_vma r_offset;
bfd_vma r_info;
} Elf_Internal_Rel;
typedef struct elf_internal_rela {
bfd_vma r_offset;
bfd_vma r_info;
bfd_vma r_addend;
} Elf_Internal_Rela;
# 166 "../include/elf/internal.h"
typedef struct elf_internal_dyn {
bfd_vma d_tag;
union {
bfd_vma d_val;
bfd_vma d_ptr;
} d_un;
} Elf_Internal_Dyn;
# 183 "../include/elf/internal.h"
typedef struct elf_internal_verdef {
unsigned short vd_version;
unsigned short vd_flags;
unsigned short vd_ndx;
unsigned short vd_cnt;
unsigned long vd_hash;
unsigned long vd_aux;
unsigned long vd_next;
bfd *vd_bfd;
const char *vd_nodename;
struct elf_internal_verdef *vd_nextdef;
struct elf_internal_verdaux *vd_auxptr;
unsigned int vd_exp_refno;
} Elf_Internal_Verdef;
typedef struct elf_internal_verdaux {
unsigned long vda_name;
unsigned long vda_next;
const char *vda_nodename;
struct elf_internal_verdaux *vda_nextptr;
} Elf_Internal_Verdaux;
typedef struct elf_internal_verneed {
unsigned short vn_version;
unsigned short vn_cnt;
unsigned long vn_file;
unsigned long vn_aux;
unsigned long vn_next;
bfd *vn_bfd;
const char *vn_filename;
struct elf_internal_vernaux *vn_auxptr;
struct elf_internal_verneed *vn_nextref;
} Elf_Internal_Verneed;
typedef struct elf_internal_vernaux {
unsigned long vna_hash;
unsigned short vna_flags;
unsigned short vna_other;
unsigned long vna_name;
unsigned long vna_next;
const char *vna_nodename;
struct elf_internal_vernaux *vna_nextptr;
} Elf_Internal_Vernaux;
typedef struct elf_internal_versym {
unsigned short vs_vers;
} Elf_Internal_Versym;
typedef struct
{
unsigned short int si_boundto;
unsigned short int si_flags;
} Elf_Internal_Syminfo;
# 287 "../include/elf/internal.h"
struct elf_segment_map
{
struct elf_segment_map *next;
unsigned long p_type;
unsigned long p_flags;
bfd_vma p_paddr;
unsigned int p_flags_valid : 1;
unsigned int p_paddr_valid : 1;
unsigned int includes_filehdr : 1;
unsigned int includes_phdrs : 1;
unsigned int count;
asection *sections[1];
};
# 27 "elf-bfd.h" 2
# 1 "../include/elf/external.h" 1
# 40 "../include/elf/external.h"
typedef struct {
unsigned char e_ident[16];
unsigned char e_type[2];
unsigned char e_machine[2];
unsigned char e_version[4];
unsigned char e_entry[4];
unsigned char e_phoff[4];
unsigned char e_shoff[4];
unsigned char e_flags[4];
unsigned char e_ehsize[2];
unsigned char e_phentsize[2];
unsigned char e_phnum[2];
unsigned char e_shentsize[2];
unsigned char e_shnum[2];
unsigned char e_shstrndx[2];
} Elf32_External_Ehdr;
typedef struct {
unsigned char e_ident[16];
unsigned char e_type[2];
unsigned char e_machine[2];
unsigned char e_version[4];
unsigned char e_entry[8];
unsigned char e_phoff[8];
unsigned char e_shoff[8];
unsigned char e_flags[4];
unsigned char e_ehsize[2];
unsigned char e_phentsize[2];
unsigned char e_phnum[2];
unsigned char e_shentsize[2];
unsigned char e_shnum[2];
unsigned char e_shstrndx[2];
} Elf64_External_Ehdr;
typedef struct {
unsigned char p_type[4];
unsigned char p_offset[4];
unsigned char p_vaddr[4];
unsigned char p_paddr[4];
unsigned char p_filesz[4];
unsigned char p_memsz[4];
unsigned char p_flags[4];
unsigned char p_align[4];
} Elf32_External_Phdr;
typedef struct {
unsigned char p_type[4];
unsigned char p_flags[4];
unsigned char p_offset[8];
unsigned char p_vaddr[8];
unsigned char p_paddr[8];
unsigned char p_filesz[8];
unsigned char p_memsz[8];
unsigned char p_align[8];
} Elf64_External_Phdr;
typedef struct {
unsigned char sh_name[4];
unsigned char sh_type[4];
unsigned char sh_flags[4];
unsigned char sh_addr[4];
unsigned char sh_offset[4];
unsigned char sh_size[4];
unsigned char sh_link[4];
unsigned char sh_info[4];
unsigned char sh_addralign[4];
unsigned char sh_entsize[4];
} Elf32_External_Shdr;
typedef struct {
unsigned char sh_name[4];
unsigned char sh_type[4];
unsigned char sh_flags[8];
unsigned char sh_addr[8];
unsigned char sh_offset[8];
unsigned char sh_size[8];
unsigned char sh_link[4];
unsigned char sh_info[4];
unsigned char sh_addralign[8];
unsigned char sh_entsize[8];
} Elf64_External_Shdr;
typedef struct {
unsigned char st_name[4];
unsigned char st_value[4];
unsigned char st_size[4];
unsigned char st_info[1];
unsigned char st_other[1];
unsigned char st_shndx[2];
} Elf32_External_Sym;
typedef struct {
unsigned char st_name[4];
unsigned char st_info[1];
unsigned char st_other[1];
unsigned char st_shndx[2];
unsigned char st_value[8];
unsigned char st_size[8];
} Elf64_External_Sym;
typedef struct {
unsigned char namesz[4];
unsigned char descsz[4];
unsigned char type[4];
char name[1];
} Elf_External_Note;
typedef struct {
unsigned char r_offset[4];
unsigned char r_info[4];
} Elf32_External_Rel;
typedef struct {
unsigned char r_offset[4];
unsigned char r_info[4];
unsigned char r_addend[4];
} Elf32_External_Rela;
typedef struct {
unsigned char r_offset[8];
unsigned char r_info[8];
} Elf64_External_Rel;
typedef struct {
unsigned char r_offset[8];
unsigned char r_info[8];
unsigned char r_addend[8];
} Elf64_External_Rela;
typedef struct {
unsigned char d_tag[4];
union {
unsigned char d_val[4];
unsigned char d_ptr[4];
} d_un;
} Elf32_External_Dyn;
typedef struct {
unsigned char d_tag[8];
union {
unsigned char d_val[8];
unsigned char d_ptr[8];
} d_un;
} Elf64_External_Dyn;
typedef struct {
unsigned char vd_version[2];
unsigned char vd_flags[2];
unsigned char vd_ndx[2];
unsigned char vd_cnt[2];
unsigned char vd_hash[4];
unsigned char vd_aux[4];
unsigned char vd_next[4];
} Elf_External_Verdef;
typedef struct {
unsigned char vda_name[4];
unsigned char vda_next[4];
} Elf_External_Verdaux;
typedef struct {
unsigned char vn_version[2];
unsigned char vn_cnt[2];
unsigned char vn_file[4];
unsigned char vn_aux[4];
unsigned char vn_next[4];
} Elf_External_Verneed;
typedef struct {
unsigned char vna_hash[4];
unsigned char vna_flags[2];
unsigned char vna_other[2];
unsigned char vna_name[4];
unsigned char vna_next[4];
} Elf_External_Vernaux;
typedef struct {
unsigned char vs_vers[2];
}
__attribute__ ((packed))
Elf_External_Versym;
typedef struct
{
unsigned char si_boundto[2];
unsigned char si_flags[2];
} Elf_External_Syminfo;
# 28 "elf-bfd.h" 2
# 60 "elf-bfd.h"
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 elf_link_hash_entry
{
struct bfd_link_hash_entry root;
long indx;
# 106 "elf-bfd.h"
long dynindx;
unsigned long dynstr_index;
unsigned long elf_hash_value;
struct elf_link_hash_entry *weakdef;
struct elf_linker_section_pointers *linker_section_pointer;
union
{
Elf_Internal_Verdef *verdef;
struct bfd_elf_version_tree *vertree;
} verinfo;
size_t vtable_entries_size;
boolean *vtable_entries_used;
struct elf_link_hash_entry *vtable_parent;
# 154 "elf-bfd.h"
union
{
bfd_signed_vma refcount;
bfd_vma offset;
} got;
union
{
bfd_signed_vma refcount;
bfd_vma offset;
} plt;
bfd_size_type size;
char type;
unsigned char other;
unsigned short elf_link_hash_flags;
# 205 "elf-bfd.h"
};
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 elf_link_hash_table
{
struct bfd_link_hash_table root;
boolean dynamic_sections_created;
bfd *dynobj;
bfd_signed_vma init_refcount;
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 * stab_info;
void * merge_info;
struct elf_link_local_dynamic_entry *dynlocal;
struct bfd_link_needed_list *runpath;
struct elf_link_loaded_list *loaded;
};
# 314 "elf-bfd.h"
struct sym_sec_cache
{
bfd *abfd;
unsigned long indx[32];
asection *sec[32];
};
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;
unsigned char arch_size, file_align;
unsigned char elfclass, ev_current;
int (*write_out_phdrs)
(bfd *, const Elf_Internal_Phdr *, unsigned int);
boolean (*write_shdrs_and_ehdr)
(bfd *);
void (*write_relocs)
(bfd *, asection *, void *);
void (*swap_symbol_out)
(bfd *, const Elf_Internal_Sym *, void *);
boolean (*slurp_reloc_table)
(bfd *, asection *, asymbol **, boolean);
long (*slurp_symbol_table)
(bfd *, asymbol **, 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_Rel *);
void (*swap_reloc_out)
(bfd *, const Elf_Internal_Rel *, bfd_byte *);
void (*swap_reloca_in)
(bfd *, const bfd_byte *, Elf_Internal_Rela *);
void (*swap_reloca_out)
(bfd *, const Elf_Internal_Rela *, bfd_byte *);
};
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;
void *locsyms;
bfd *abfd;
size_t locsymcount;
size_t extsymoff;
struct elf_link_hash_entry **sym_hashes;
boolean bad_symtab;
};
struct elf_backend_data
{
enum bfd_architecture arch;
int elf_machine_code;
bfd_vma maxpagesize;
void (*elf_info_to_howto)
(bfd *, arelent *, Elf_Internal_Rela *);
void (*elf_info_to_howto_rel)
(bfd *, arelent *, Elf_Internal_Rel *);
boolean (*elf_backend_sym_is_global)
(bfd *, asymbol *);
# 441 "elf-bfd.h"
boolean (*elf_backend_object_p)
(bfd *);
void (*elf_backend_symbol_processing)
(bfd *, asymbol *);
boolean (*elf_backend_symbol_table_processing)
(bfd *, elf_symbol_type *, unsigned int);
int (*elf_backend_get_symbol_type)
( Elf_Internal_Sym *, int);
boolean (*elf_backend_section_processing)
(bfd *, Elf_Internal_Shdr *);
boolean (*elf_backend_section_from_shdr)
(bfd *, Elf_Internal_Shdr *, char *);
boolean (*elf_backend_section_flags)
(flagword *, Elf_Internal_Shdr *);
boolean (*elf_backend_section_from_phdr)
(bfd *, Elf_Internal_Phdr *, int);
boolean (*elf_backend_fake_sections)
(bfd *, Elf_Internal_Shdr *, asection *);
boolean (*elf_backend_section_from_bfd_section)
(bfd *, Elf_Internal_Shdr *, asection *, int *retval);
# 503 "elf-bfd.h"
boolean (*elf_add_symbol_hook)
(bfd *abfd, struct bfd_link_info *info, const Elf_Internal_Sym *, const char **name, flagword *flags, asection **sec, bfd_vma *value);
boolean (*elf_backend_link_output_symbol_hook)
(bfd *, struct bfd_link_info *info, const char *, Elf_Internal_Sym *, asection *);
# 522 "elf-bfd.h"
boolean (*elf_backend_create_dynamic_sections)
(bfd *abfd, struct bfd_link_info *info);
# 535 "elf-bfd.h"
boolean (*check_relocs)
(bfd *abfd, struct bfd_link_info *info, asection *o, const Elf_Internal_Rela *relocs);
# 551 "elf-bfd.h"
boolean (*elf_backend_adjust_dynamic_symbol)
(struct bfd_link_info *info, struct elf_link_hash_entry *h);
boolean (*elf_backend_always_size_sections)
(bfd *output_bfd, struct bfd_link_info *info);
# 571 "elf-bfd.h"
boolean (*elf_backend_size_dynamic_sections)
(bfd *output_bfd, struct bfd_link_info *info);
# 602 "elf-bfd.h"
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);
# 615 "elf-bfd.h"
boolean (*elf_backend_finish_dynamic_symbol)
(bfd *output_bfd, struct bfd_link_info *info, struct elf_link_hash_entry *h, Elf_Internal_Sym *sym);
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 *, boolean linker);
int (*elf_backend_additional_program_headers)
(bfd *);
boolean (*elf_backend_modify_segment_map)
(bfd *);
asection * (*gc_mark_hook)
(bfd *abfd, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *h, Elf_Internal_Sym *);
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 *);
boolean (*elf_backend_output_arch_syms)
(bfd *, struct bfd_link_info *, void *, boolean (*) (void *, const char *, Elf_Internal_Sym *, asection *));
void (*elf_backend_copy_indirect_symbol)
(struct elf_link_hash_entry *, struct elf_link_hash_entry *);
void (*elf_backend_hide_symbol)
(struct bfd_link_info *, struct elf_link_hash_entry *);
void (*elf_backend_emit_relocs)
(bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *);
unsigned int (*elf_backend_count_relocs)
(asection *, Elf_Internal_Rela *);
boolean (*elf_backend_grok_prstatus)
(bfd *, Elf_Internal_Note *);
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 *);
boolean (*elf_backend_discard_info)
(bfd *, struct elf_reloc_cookie *, struct bfd_link_info *);
boolean (*elf_backend_ignore_discarded_relocs)
(asection *);
boolean (*elf_backend_write_section)
(bfd *, asection *, bfd_byte *);
const struct ecoff_debug_swap *elf_backend_ecoff_debug_swap;
int elf_machine_alt1;
int elf_machine_alt2;
const struct elf_size_info *s;
bfd_vma got_symbol_offset;
bfd_vma got_header_size;
bfd_vma plt_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 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;
};
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;
void * local_dynrel;
asection *sreloc;
int this_idx;
int rel_idx;
int rel_idx2;
struct elf_link_hash_entry **rel_hashes;
Elf_Internal_Rela *relocs;
long dynindx;
void * stab_info;
void * merge_info;
const char *group_name;
asection *next_in_group;
void * tdata;
unsigned int use_rela_p:1;
};
# 887 "elf-bfd.h"
typedef enum elf_linker_section_enum
{
LINKER_SECTION_UNKNOWN,
LINKER_SECTION_GOT,
LINKER_SECTION_PLT,
LINKER_SECTION_SDATA,
LINKER_SECTION_SDATA2,
LINKER_SECTION_MAX
} elf_linker_section_enum_t;
typedef struct elf_linker_section
{
char *name;
char *rel_name;
char *bss_name;
char *sym_name;
asection *section;
asection *bss_section;
asection *rel_section;
struct elf_link_hash_entry *sym_hash;
bfd_vma initial_size;
bfd_vma sym_offset;
bfd_vma hole_size;
bfd_vma hole_offset;
bfd_vma max_hole_offset;
elf_linker_section_enum_t which;
boolean hole_written_p;
unsigned int alignment;
flagword flags;
} elf_linker_section_t;
typedef struct elf_linker_section_pointers
{
struct elf_linker_section_pointers *next;
bfd_vma offset;
bfd_vma addend;
elf_linker_section_enum_t which;
boolean written_address_p;
} elf_linker_section_pointers_t;
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;
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;
unsigned int symtab_section, shstrtab_section;
unsigned int strtab_section, dynsymtab_section;
unsigned int dynversym_section, dynverdef_section, dynverref_section;
file_ptr next_file_pos;
bfd_vma gp;
unsigned int gp_size;
Elf_Internal_Shdr **group_sect_ptr;
int num_group;
int core_signal;
int core_pid;
int core_lwpid;
char* core_program;
char* core_command;
boolean linker;
struct elf_link_hash_entry **sym_hashes;
# 993 "elf-bfd.h"
union
{
bfd_signed_vma *refcounts;
bfd_vma *offsets;
} local_got;
elf_linker_section_pointers_t **linker_section_pointers;
# 1011 "elf-bfd.h"
const char *dt_name;
const char *dt_soname;
boolean bad_symtab;
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;
boolean flags_init;
unsigned int cverdefs;
unsigned int cverrefs;
Elf_Internal_Verdef *verdef;
Elf_Internal_Verneed *verref;
struct elf_linker_section *linker_section[ (int)LINKER_SECTION_MAX ];
asymbol *elf_data_symbol;
asymbol *elf_text_symbol;
asection *elf_data_section;
asection *elf_text_section;
};
# 1104 "elf-bfd.h"
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 boolean _bfd_elf_print_private_bfd_data
(bfd *, void *);
extern void bfd_elf_print_symbol
(bfd *, void *, asymbol *, bfd_print_symbol_type);
# 1144 "elf-bfd.h"
extern void _bfd_elf_sprintf_vma
(bfd *, char *, bfd_vma);
extern void _bfd_elf_fprintf_vma
(bfd *, void *, bfd_vma);
extern enum elf_reloc_type_class _bfd_elf_reloc_type_class
(const Elf_Internal_Rela *);
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 boolean bfd_elf_mkobject
(bfd *);
extern boolean bfd_elf_mkcorefile
(bfd *);
extern Elf_Internal_Shdr *bfd_elf_find_section
(bfd *, char *);
extern boolean _bfd_elf_make_section_from_shdr
(bfd *, Elf_Internal_Shdr *, const char *);
extern 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
(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 *);
extern 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 boolean _bfd_elf_slurp_version_tables
(bfd *);
extern boolean _bfd_elf_merge_sections
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elf_copy_private_symbol_data
(bfd *, asymbol *, bfd *, asymbol *);
extern boolean _bfd_elf_copy_private_section_data
(bfd *, asection *, bfd *, asection *);
extern boolean _bfd_elf_write_object_contents
(bfd *);
extern boolean _bfd_elf_write_corefile_contents
(bfd *);
extern boolean _bfd_elf_set_section_contents
(bfd *, sec_ptr, void *, file_ptr, bfd_size_type);
extern long _bfd_elf_get_symtab_upper_bound
(bfd *);
extern long _bfd_elf_get_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_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 boolean _bfd_elf_is_local_label_name
(bfd *, const char *);
extern alent *_bfd_elf_get_lineno
(bfd *, asymbol *);
extern boolean _bfd_elf_set_arch_mach
(bfd *, enum bfd_architecture, unsigned long);
extern boolean _bfd_elf_find_nearest_line
(bfd *, asection *, asymbol **, bfd_vma, const char **, const char **, unsigned int *);
extern int _bfd_elf_sizeof_headers
(bfd *, boolean);
extern boolean _bfd_elf_new_section_hook
(bfd *, asection *);
extern boolean _bfd_elf_init_reloc_shdr
(bfd *, Elf_Internal_Shdr *, asection *, boolean);
extern void _bfd_elf_no_info_to_howto
(bfd *, arelent *, Elf_Internal_Rela *);
extern boolean bfd_section_from_shdr
(bfd *, unsigned int shindex);
extern 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 boolean _bfd_elf_create_dynamic_sections
(bfd *, struct bfd_link_info *);
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 *, 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 boolean _bfd_elf_strtab_emit
(bfd *, struct elf_strtab_hash *);
extern void _bfd_elf_strtab_finalize
(struct elf_strtab_hash *);
extern boolean _bfd_elf_link_record_dynamic_symbol
(struct bfd_link_info *, struct elf_link_hash_entry *);
extern long _bfd_elf_link_lookup_local_dynindx
(struct bfd_link_info *, bfd *, long);
extern 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, boolean);
extern boolean _bfd_elf_validate_reloc
(bfd *, arelent *);
extern boolean _bfd_elf_create_dynamic_sections
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elf_create_got_section
(bfd *, struct bfd_link_info *);
extern unsigned long _bfd_elf_link_renumber_dynsyms
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elfcore_make_pseudosection
(bfd *, char *, size_t, ufile_ptr);
extern char *_bfd_elfcore_strndup
(bfd *, char *, size_t);
extern elf_linker_section_t *_bfd_elf_create_linker_section
(bfd *, struct bfd_link_info *, enum elf_linker_section_enum, elf_linker_section_t *);
extern elf_linker_section_pointers_t *_bfd_elf_find_pointer_linker_section
(elf_linker_section_pointers_t *, bfd_vma, elf_linker_section_enum_t);
extern boolean bfd_elf32_create_pointer_linker_section
(bfd *, struct bfd_link_info *, elf_linker_section_t *, struct elf_link_hash_entry *, const Elf_Internal_Rela *);
extern bfd_vma bfd_elf32_finish_pointer_linker_section
(bfd *, bfd *, struct bfd_link_info *, elf_linker_section_t *, struct elf_link_hash_entry *, bfd_vma, const Elf_Internal_Rela *, int);
extern boolean bfd_elf64_create_pointer_linker_section
(bfd *, struct bfd_link_info *, elf_linker_section_t *, struct elf_link_hash_entry *, const Elf_Internal_Rela *);
extern bfd_vma bfd_elf64_finish_pointer_linker_section
(bfd *, bfd *, struct bfd_link_info *, elf_linker_section_t *, struct elf_link_hash_entry *, bfd_vma, const Elf_Internal_Rela *, int);
extern boolean _bfd_elf_make_linker_section_rela
(bfd *, elf_linker_section_t *, int);
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 boolean bfd_elf32_core_file_matches_executable_p
(bfd *, bfd *);
extern boolean bfd_elf32_bfd_link_add_symbols
(bfd *, struct bfd_link_info *);
extern boolean bfd_elf32_bfd_final_link
(bfd *, struct bfd_link_info *);
extern void bfd_elf32_swap_symbol_in
(bfd *, const Elf32_External_Sym *, Elf_Internal_Sym *);
extern void bfd_elf32_swap_symbol_out
(bfd *, const Elf_Internal_Sym *, void *);
extern void bfd_elf32_swap_reloc_in
(bfd *, const Elf32_External_Rel *, Elf_Internal_Rel *);
extern void bfd_elf32_swap_reloc_out
(bfd *, const Elf_Internal_Rel *, Elf32_External_Rel *);
extern void bfd_elf32_swap_reloca_in
(bfd *, const Elf32_External_Rela *, Elf_Internal_Rela *);
extern void bfd_elf32_swap_reloca_out
(bfd *, const Elf_Internal_Rela *, Elf32_External_Rela *);
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 **, boolean);
extern 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 boolean bfd_elf32_slurp_reloc_table
(bfd *, asection *, asymbol **, boolean);
extern boolean bfd_elf32_add_dynamic_entry
(struct bfd_link_info *, bfd_vma, bfd_vma);
extern boolean bfd_elf32_link_create_dynamic_sections
(bfd *, struct bfd_link_info *);
extern Elf_Internal_Rela *_bfd_elf32_link_read_relocs
(bfd *, asection *, void *, Elf_Internal_Rela *, 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 boolean bfd_elf64_core_file_matches_executable_p
(bfd *, bfd *);
extern boolean bfd_elf64_bfd_link_add_symbols
(bfd *, struct bfd_link_info *);
extern boolean bfd_elf64_bfd_final_link
(bfd *, struct bfd_link_info *);
extern void bfd_elf64_swap_symbol_in
(bfd *, const Elf64_External_Sym *, Elf_Internal_Sym *);
extern void bfd_elf64_swap_symbol_out
(bfd *, const Elf_Internal_Sym *, void *);
extern void bfd_elf64_swap_reloc_in
(bfd *, const Elf64_External_Rel *, Elf_Internal_Rel *);
extern void bfd_elf64_swap_reloc_out
(bfd *, const Elf_Internal_Rel *, Elf64_External_Rel *);
extern void bfd_elf64_swap_reloca_in
(bfd *, const Elf64_External_Rela *, Elf_Internal_Rela *);
extern void bfd_elf64_swap_reloca_out
(bfd *, const Elf_Internal_Rela *, Elf64_External_Rela *);
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 **, boolean);
extern 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 boolean bfd_elf64_slurp_reloc_table
(bfd *, asection *, asymbol **, boolean);
extern boolean bfd_elf64_add_dynamic_entry
(struct bfd_link_info *, bfd_vma, bfd_vma);
extern boolean bfd_elf64_link_create_dynamic_sections
(bfd *, struct bfd_link_info *);
extern Elf_Internal_Rela *_bfd_elf64_link_read_relocs
(bfd *, asection *, void *, Elf_Internal_Rela *, boolean);
extern boolean _bfd_elf32_link_record_local_dynamic_symbol
(struct bfd_link_info *, bfd *, long);
extern boolean _bfd_elf64_link_record_local_dynamic_symbol
(struct bfd_link_info *, bfd *, long);
extern boolean _bfd_elf_close_and_cleanup
(bfd *);
extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn
(bfd *, arelent *, struct symbol_cache_entry *, void *, asection *, bfd *, char **);
extern boolean _bfd_elf32_gc_sections
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elf32_gc_common_finalize_got_offsets
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elf32_gc_common_final_link
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elf32_gc_record_vtinherit
(bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
extern boolean _bfd_elf32_gc_record_vtentry
(bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
extern boolean _bfd_elf64_gc_sections
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elf64_gc_common_finalize_got_offsets
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elf64_gc_common_final_link
(bfd *, struct bfd_link_info *);
extern boolean _bfd_elf64_gc_record_vtinherit
(bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
extern boolean _bfd_elf64_gc_record_vtentry
(bfd *, asection *, struct elf_link_hash_entry *, bfd_vma);
extern boolean _bfd_elf32_reloc_symbol_deleted_p
(bfd_vma, void *);
extern boolean _bfd_elf64_reloc_symbol_deleted_p
(bfd_vma, void *);
extern boolean _bfd_mips_elf_object_p
(bfd *);
extern boolean _bfd_mips_elf_section_from_shdr
(bfd *, Elf_Internal_Shdr *, char *);
extern boolean _bfd_mips_elf_fake_sections
(bfd *, Elf_Internal_Shdr *, asection *);
extern boolean _bfd_mips_elf_section_from_bfd_section
(bfd *, Elf_Internal_Shdr *, asection *, int *);
extern boolean _bfd_mips_elf_section_processing
(bfd *, Elf_Internal_Shdr *);
extern void _bfd_mips_elf_symbol_processing
(bfd *, asymbol *);
extern boolean _bfd_mips_elf_read_ecoff_info
(bfd *, asection *, struct ecoff_debug_info *);
extern void _bfd_mips_elf_final_write_processing
(bfd *, boolean);
extern bfd_reloc_status_type _bfd_mips_elf_hi16_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
extern bfd_reloc_status_type _bfd_mips_elf_lo16_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
extern bfd_reloc_status_type _bfd_mips_elf_gprel16_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
extern bfd_reloc_status_type _bfd_mips_elf_got16_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
extern bfd_reloc_status_type _bfd_mips_elf_gprel32_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
extern boolean _bfd_mips_elf_set_private_flags
(bfd *, flagword);
extern boolean _bfd_mips_elf_copy_private_bfd_data
(bfd *, bfd *);
extern boolean _bfd_mips_elf_merge_private_bfd_data
(bfd *, bfd *);
extern boolean _bfd_mips_elf_find_nearest_line
(bfd *, asection *, asymbol **, bfd_vma, const char **, const char **, unsigned int *);
extern boolean _bfd_mips_elf_set_section_contents
(bfd *, asection *, void *, file_ptr, bfd_size_type);
extern boolean _bfd_mips_elf_create_dynamic_sections
(bfd *, struct bfd_link_info *);
extern boolean _bfd_mips_elf_add_symbol_hook
(bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, const char **, flagword *, asection **, bfd_vma *);
extern boolean _bfd_mips_elf_adjust_dynamic_symbol
(struct bfd_link_info *, struct elf_link_hash_entry *);
extern boolean _bfd_mips_elf_finish_dynamic_symbol
(bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, Elf_Internal_Sym *);
extern boolean _bfd_mips_elf_finish_dynamic_sections
(bfd *, struct bfd_link_info *);
extern asection * _bfd_mips_elf_gc_mark_hook
(bfd *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *, Elf_Internal_Sym *);
extern boolean _bfd_mips_elf_gc_sweep_hook
(bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
extern boolean _bfd_mips_elf_always_size_sections
(bfd *, struct bfd_link_info *);
extern boolean _bfd_mips_elf_size_dynamic_sections
(bfd *, struct bfd_link_info *);
extern boolean _bfd_mips_elf_check_relocs
(bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
extern struct bfd_link_hash_table *_bfd_mips_elf_link_hash_table_create
(bfd *);
extern boolean _bfd_mips_elf_print_private_bfd_data
(bfd *, void *);
extern boolean _bfd_mips_elf_link_output_symbol_hook
(bfd *, struct bfd_link_info *, const char *, Elf_Internal_Sym *, asection *);
extern boolean _bfd_mips_elf_final_link
(bfd *, struct bfd_link_info *);
extern int _bfd_mips_elf_additional_program_headers
(bfd *);
extern boolean _bfd_mips_elf_modify_segment_map
(bfd *);
extern boolean _bfd_mips_elf_relocate_section
(bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
extern boolean _sh_elf_set_mach_from_flags
(bfd *);
# 73 "elfcode.h" 2
# 160 "elfcode.h"
static void elf_swap_ehdr_in
(bfd *, const Elf64_External_Ehdr *, Elf_Internal_Ehdr *);
static void elf_swap_ehdr_out
(bfd *, const Elf_Internal_Ehdr *, Elf64_External_Ehdr *);
static void elf_swap_shdr_in
(bfd *, const Elf64_External_Shdr *, Elf_Internal_Shdr *);
static void elf_swap_shdr_out
(bfd *, const Elf_Internal_Shdr *, Elf64_External_Shdr *);
static boolean elf_slurp_reloc_table_from_section
(bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *, asymbol **, boolean);
static boolean elf_file_p (Elf64_External_Ehdr *);
# 205 "elfcode.h"
void
bfd_elf64_swap_symbol_in (abfd, src, dst)
bfd *abfd;
const Elf64_External_Sym *src;
Elf_Internal_Sym *dst;
{
int signed_vma = ((struct elf_backend_data *) (abfd)->xvec->backend_data)->sign_extend_vma;
dst->st_name = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->st_name)));
if (signed_vma)
dst->st_value = ((*(((abfd))->xvec->bfd_h_getx_signed_64)) ((bfd_byte *) (src->st_value)));
else
dst->st_value = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->st_value)));
dst->st_size = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->st_size)));
dst->st_info = (*(unsigned char *) (src->st_info) & 0xff);
dst->st_other = (*(unsigned char *) (src->st_other) & 0xff);
dst->st_shndx = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->st_shndx)));
}
void
bfd_elf64_swap_symbol_out (abfd, src, cdst)
bfd *abfd;
const Elf_Internal_Sym *src;
void * cdst;
{
Elf64_External_Sym *dst = (Elf64_External_Sym *) cdst;
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->st_name), (bfd_byte *) (dst->st_name)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->st_value), (bfd_byte *) (dst->st_value)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->st_size), (bfd_byte *) (dst->st_size)));
((void) (*((unsigned char *) (dst->st_info)) = (unsigned char) (src->st_info)));
((void) (*((unsigned char *) (dst->st_other)) = (unsigned char) (src->st_other)));
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->st_shndx), (bfd_byte *) (dst->st_shndx)));
}
static void
elf_swap_ehdr_in (abfd, src, dst)
bfd *abfd;
const Elf64_External_Ehdr *src;
Elf_Internal_Ehdr *dst;
{
int signed_vma = ((struct elf_backend_data *) (abfd)->xvec->backend_data)->sign_extend_vma;
memcpy (dst->e_ident, src->e_ident, 16);
dst->e_type = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->e_type)));
dst->e_machine = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->e_machine)));
dst->e_version = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->e_version)));
if (signed_vma)
dst->e_entry = ((*(((abfd))->xvec->bfd_h_getx_signed_64)) ((bfd_byte *) (src->e_entry)));
else
dst->e_entry = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->e_entry)));
dst->e_phoff = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->e_phoff)));
dst->e_shoff = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->e_shoff)));
dst->e_flags = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->e_flags)));
dst->e_ehsize = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->e_ehsize)));
dst->e_phentsize = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->e_phentsize)));
dst->e_phnum = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->e_phnum)));
dst->e_shentsize = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->e_shentsize)));
dst->e_shnum = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->e_shnum)));
dst->e_shstrndx = ((*(((abfd))->xvec->bfd_h_getx16)) ((bfd_byte *) (src->e_shstrndx)));
}
static void
elf_swap_ehdr_out (abfd, src, dst)
bfd *abfd;
const Elf_Internal_Ehdr *src;
Elf64_External_Ehdr *dst;
{
int signed_vma = ((struct elf_backend_data *) (abfd)->xvec->backend_data)->sign_extend_vma;
memcpy (dst->e_ident, src->e_ident, 16);
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->e_type), (bfd_byte *) (dst->e_type)));
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->e_machine), (bfd_byte *) (dst->e_machine)));
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->e_version), (bfd_byte *) (dst->e_version)));
if (signed_vma)
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->e_entry), (bfd_byte *) (dst->e_entry)));
else
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->e_entry), (bfd_byte *) (dst->e_entry)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->e_phoff), (bfd_byte *) (dst->e_phoff)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->e_shoff), (bfd_byte *) (dst->e_shoff)));
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->e_flags), (bfd_byte *) (dst->e_flags)));
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->e_ehsize), (bfd_byte *) (dst->e_ehsize)));
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->e_phentsize), (bfd_byte *) (dst->e_phentsize)));
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->e_phnum), (bfd_byte *) (dst->e_phnum)));
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->e_shentsize), (bfd_byte *) (dst->e_shentsize)));
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->e_shnum), (bfd_byte *) (dst->e_shnum)));
((*(((abfd))->xvec->bfd_h_putx16)) ((bfd_vma) (src->e_shstrndx), (bfd_byte *) (dst->e_shstrndx)));
}
static void
elf_swap_shdr_in (abfd, src, dst)
bfd *abfd;
const Elf64_External_Shdr *src;
Elf_Internal_Shdr *dst;
{
int signed_vma = ((struct elf_backend_data *) (abfd)->xvec->backend_data)->sign_extend_vma;
dst->sh_name = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->sh_name)));
dst->sh_type = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->sh_type)));
dst->sh_flags = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->sh_flags)));
if (signed_vma)
dst->sh_addr = ((*(((abfd))->xvec->bfd_h_getx_signed_64)) ((bfd_byte *) (src->sh_addr)));
else
dst->sh_addr = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->sh_addr)));
dst->sh_offset = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->sh_offset)));
dst->sh_size = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->sh_size)));
dst->sh_link = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->sh_link)));
dst->sh_info = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->sh_info)));
dst->sh_addralign = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->sh_addralign)));
dst->sh_entsize = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->sh_entsize)));
dst->bfd_section = ((void *)0);
dst->contents = ((void *)0);
}
static void
elf_swap_shdr_out (abfd, src, dst)
bfd *abfd;
const Elf_Internal_Shdr *src;
Elf64_External_Shdr *dst;
{
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->sh_name), (bfd_byte *) (dst->sh_name)));
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->sh_type), (bfd_byte *) (dst->sh_type)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->sh_flags), (bfd_byte *) (dst->sh_flags)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->sh_addr), (bfd_byte *) (dst->sh_addr)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->sh_offset), (bfd_byte *) (dst->sh_offset)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->sh_size), (bfd_byte *) (dst->sh_size)));
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->sh_link), (bfd_byte *) (dst->sh_link)));
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->sh_info), (bfd_byte *) (dst->sh_info)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->sh_addralign), (bfd_byte *) (dst->sh_addralign)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->sh_entsize), (bfd_byte *) (dst->sh_entsize)));
}
void
bfd_elf64_swap_phdr_in (abfd, src, dst)
bfd *abfd;
const Elf64_External_Phdr *src;
Elf_Internal_Phdr *dst;
{
int signed_vma = ((struct elf_backend_data *) (abfd)->xvec->backend_data)->sign_extend_vma;
dst->p_type = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->p_type)));
dst->p_flags = ((*(((abfd))->xvec->bfd_h_getx32)) ((bfd_byte *) (src->p_flags)));
dst->p_offset = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->p_offset)));
if (signed_vma)
{
dst->p_vaddr = ((*(((abfd))->xvec->bfd_h_getx_signed_64)) ((bfd_byte *) (src->p_vaddr)));
dst->p_paddr = ((*(((abfd))->xvec->bfd_h_getx_signed_64)) ((bfd_byte *) (src->p_paddr)));
}
else
{
dst->p_vaddr = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->p_vaddr)));
dst->p_paddr = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->p_paddr)));
}
dst->p_filesz = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->p_filesz)));
dst->p_memsz = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->p_memsz)));
dst->p_align = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->p_align)));
}
void
bfd_elf64_swap_phdr_out (abfd, src, dst)
bfd *abfd;
const Elf_Internal_Phdr *src;
Elf64_External_Phdr *dst;
{
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->p_type), (bfd_byte *) (dst->p_type)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->p_offset), (bfd_byte *) (dst->p_offset)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->p_vaddr), (bfd_byte *) (dst->p_vaddr)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->p_paddr), (bfd_byte *) (dst->p_paddr)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->p_filesz), (bfd_byte *) (dst->p_filesz)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->p_memsz), (bfd_byte *) (dst->p_memsz)));
((*(((abfd))->xvec->bfd_h_putx32)) ((bfd_vma) (src->p_flags), (bfd_byte *) (dst->p_flags)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->p_align), (bfd_byte *) (dst->p_align)));
}
__inline__ void
bfd_elf64_swap_reloc_in (abfd, src, dst)
bfd *abfd;
const Elf64_External_Rel *src;
Elf_Internal_Rel *dst;
{
dst->r_offset = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->r_offset)));
dst->r_info = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->r_info)));
}
__inline__ void
bfd_elf64_swap_reloca_in (abfd, src, dst)
bfd *abfd;
const Elf64_External_Rela *src;
Elf_Internal_Rela *dst;
{
dst->r_offset = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->r_offset)));
dst->r_info = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->r_info)));
dst->r_addend = ((*(((abfd))->xvec->bfd_h_getx_signed_64)) ((bfd_byte *) (src->r_addend)));
}
__inline__ void
bfd_elf64_swap_reloc_out (abfd, src, dst)
bfd *abfd;
const Elf_Internal_Rel *src;
Elf64_External_Rel *dst;
{
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->r_offset), (bfd_byte *) (dst->r_offset)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->r_info), (bfd_byte *) (dst->r_info)));
}
__inline__ void
bfd_elf64_swap_reloca_out (abfd, src, dst)
bfd *abfd;
const Elf_Internal_Rela *src;
Elf64_External_Rela *dst;
{
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->r_offset), (bfd_byte *) (dst->r_offset)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->r_info), (bfd_byte *) (dst->r_info)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->r_addend), (bfd_byte *) (dst->r_addend)));
}
__inline__ void
bfd_elf64_swap_dyn_in (abfd, p, dst)
bfd *abfd;
const void * p;
Elf_Internal_Dyn *dst;
{
const Elf64_External_Dyn *src = (const Elf64_External_Dyn *) p;
dst->d_tag = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->d_tag)));
dst->d_un.d_val = ((*(((abfd))->xvec->bfd_h_getx64)) ((bfd_byte *) (src->d_un.d_val)));
}
__inline__ void
bfd_elf64_swap_dyn_out (abfd, src, p)
bfd *abfd;
const Elf_Internal_Dyn *src;
void * p;
{
Elf64_External_Dyn *dst = (Elf64_External_Dyn *) p;
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->d_tag), (bfd_byte *) (dst->d_tag)));
((*(((abfd))->xvec->bfd_h_putx64)) ((bfd_vma) (src->d_un.d_val), (bfd_byte *) (dst->d_un.d_val)));
}
# 472 "elfcode.h"
static __inline__ boolean
elf_file_p (x_ehdrp)
Elf64_External_Ehdr *x_ehdrp;
{
return ((x_ehdrp->e_ident[0] == 0x7F)
&& (x_ehdrp->e_ident[1] == 'E')
&& (x_ehdrp->e_ident[2] == 'L')
&& (x_ehdrp->e_ident[3] == 'F'));
}
# 490 "elfcode.h"
const bfd_target *
bfd_elf64_object_p (abfd)
bfd *abfd;
{
Elf64_External_Ehdr x_ehdr;
Elf_Internal_Ehdr *i_ehdrp;
Elf64_External_Shdr x_shdr;
Elf_Internal_Shdr *i_shdrp = ((void *)0);
unsigned int shindex;
char *shstrtab;
struct elf_backend_data *ebd;
struct elf_obj_tdata *preserved_tdata = ((abfd) -> tdata.elf_obj_data);
struct sec *preserved_sections = abfd->sections;
unsigned int preserved_section_count = abfd->section_count;
enum bfd_architecture previous_arch = bfd_get_arch (abfd);
unsigned long previous_mach = bfd_get_mach (abfd);
struct elf_obj_tdata *new_tdata = ((void *)0);
asection *s;
bfd_size_type amt;
abfd->sections = ((void *)0);
abfd->section_count = 0;
if (bfd_bread ((void *) & x_ehdr, (bfd_size_type) sizeof (x_ehdr), abfd)
!= sizeof (x_ehdr))
{
if (bfd_get_error () != bfd_error_system_call)
goto got_wrong_format_error;
else
goto got_no_match;
}
if ((elf_file_p (&x_ehdr) == false) ||
(x_ehdr.e_ident[6] != 1) ||
(x_ehdr.e_ident[4] != 2))
goto got_wrong_format_error;
switch (x_ehdr.e_ident[5])
{
case 2:
if (! ((abfd)->xvec->header_byteorder == BFD_ENDIAN_BIG))
goto got_wrong_format_error;
break;
case 1:
if (! ((abfd)->xvec->header_byteorder == BFD_ENDIAN_LITTLE))
goto got_wrong_format_error;
break;
case 0:
default:
goto got_wrong_format_error;
}
amt = sizeof (struct elf_obj_tdata);
new_tdata = (struct elf_obj_tdata *) bfd_zalloc (abfd, amt);
if (new_tdata == ((void *)0))
goto got_no_match;
((abfd) -> tdata.elf_obj_data) = new_tdata;
i_ehdrp = (((abfd) -> tdata.elf_obj_data) -> elf_header);
elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
if (i_ehdrp->e_type == 4)
goto got_wrong_format_error;
if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == 1)
goto got_wrong_format_error;
if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
goto got_wrong_format_error;
ebd = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
if (ebd->elf_machine_code != i_ehdrp->e_machine
&& (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
&& (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
{
const bfd_target * const *target_ptr;
if (ebd->elf_machine_code != 0)
goto got_wrong_format_error;
for (target_ptr = bfd_target_vector; *target_ptr != ((void *)0); target_ptr++)
{
struct elf_backend_data *back;
if ((*target_ptr)->flavour != bfd_target_elf_flavour)
continue;
back = (struct elf_backend_data *) (*target_ptr)->backend_data;
if (back->elf_machine_code == i_ehdrp->e_machine
|| (back->elf_machine_alt1 != 0
&& back->elf_machine_alt1 == i_ehdrp->e_machine)
|| (back->elf_machine_alt2 != 0
&& back->elf_machine_alt2 == i_ehdrp->e_machine))
{
goto got_wrong_format_error;
}
}
}
if (i_ehdrp->e_type == 2)
abfd->flags |= 0x02;
else if (i_ehdrp->e_type == 3)
abfd->flags |= 0x40;
if (i_ehdrp->e_phnum > 0)
abfd->flags |= 0x100;
if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
{
if (ebd->elf_machine_code != 0)
goto got_no_match;
}
bfd_set_start_address (abfd, i_ehdrp->e_entry);
if (i_ehdrp->e_shnum != 0)
{
amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
amt = sizeof (i_shdrp) * i_ehdrp->e_shnum;
(((abfd) -> tdata.elf_obj_data) -> elf_sect_ptr) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
if (!i_shdrp || !(((abfd) -> tdata.elf_obj_data) -> elf_sect_ptr))
goto got_no_match;
if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, 0) != 0)
goto got_no_match;
}
for (shindex = 0; shindex < i_ehdrp->e_shnum; shindex++)
{
if (bfd_bread ((void *) & x_shdr, (bfd_size_type) sizeof x_shdr, abfd)
!= sizeof (x_shdr))
goto got_no_match;
elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
(((abfd) -> tdata.elf_obj_data) -> elf_sect_ptr)[shindex] = i_shdrp + shindex;
if (i_shdrp[shindex].sh_size != 0
&& (i_shdrp[shindex].sh_flags & (1 << 1)) != 0
&& i_shdrp[shindex].sh_type != 8
&& (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
% ebd->maxpagesize)
!= 0))
abfd->flags &= ~0x100;
}
if (i_ehdrp->e_shstrndx)
{
if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
goto got_no_match;
}
if (i_ehdrp->e_phnum == 0)
((abfd) -> tdata.elf_obj_data)->phdr = ((void *)0);
else
{
Elf_Internal_Phdr *i_phdr;
unsigned int i;
amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
((abfd) -> tdata.elf_obj_data)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
if (((abfd) -> tdata.elf_obj_data)->phdr == ((void *)0))
goto got_no_match;
if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, 0) != 0)
goto got_no_match;
i_phdr = ((abfd) -> tdata.elf_obj_data)->phdr;
for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
{
Elf64_External_Phdr x_phdr;
if (bfd_bread ((void *) &x_phdr, (bfd_size_type) sizeof x_phdr, abfd)
!= sizeof x_phdr)
goto got_no_match;
bfd_elf64_swap_phdr_in (abfd, &x_phdr, i_phdr);
}
}
if (i_ehdrp->e_shstrndx != 0)
{
shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
if (!shstrtab)
goto got_no_match;
for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
{
if (! bfd_section_from_shdr (abfd, shindex))
goto got_no_match;
}
}
if (ebd->elf_backend_object_p)
{
if ((*ebd->elf_backend_object_p) (abfd) == false)
goto got_wrong_format_error;
}
for (s = abfd->sections; s != ((void *)0); s = s->next)
{
if ((((struct bfd_elf_section_data*)s->used_by_bfd)->this_hdr.sh_type == 9
|| ((struct bfd_elf_section_data*)s->used_by_bfd)->this_hdr.sh_type == 4)
&& ((struct bfd_elf_section_data*)s->used_by_bfd)->this_hdr.sh_info > 0)
{
unsigned long targ_index;
asection *targ_sec;
targ_index = ((struct bfd_elf_section_data*)s->used_by_bfd)->this_hdr.sh_info;
targ_sec = bfd_section_from_elf_index (abfd, targ_index);
if (targ_sec != ((void *)0)
&& (targ_sec->flags & 0x10000) != 0)
s->flags |= 0x10000;
}
}
return (abfd->xvec);
got_wrong_format_error:
# 763 "elfcode.h"
bfd_default_set_arch_mach (abfd, previous_arch, previous_mach);
bfd_set_error (bfd_error_wrong_format);
got_no_match:
if (new_tdata != ((void *)0)
&& new_tdata->elf_sect_ptr != ((void *)0))
bfd_release (abfd, new_tdata->elf_sect_ptr);
if (i_shdrp != ((void *)0))
bfd_release (abfd, i_shdrp);
if (new_tdata != ((void *)0))
bfd_release (abfd, new_tdata);
((abfd) -> tdata.elf_obj_data) = preserved_tdata;
abfd->sections = preserved_sections;
abfd->section_count = preserved_section_count;
return (((void *)0));
}
void
bfd_elf64_write_relocs (abfd, sec, data)
bfd *abfd;
asection *sec;
void * data;
{
boolean *failedp = (boolean *) data;
Elf_Internal_Shdr *rela_hdr;
Elf64_External_Rela *outbound_relocas;
Elf64_External_Rel *outbound_relocs;
unsigned int idx;
int use_rela_p;
asymbol *last_sym = 0;
int last_sym_idx = 0;
if (*failedp)
return;
if ((sec->flags & 0x004) == 0)
return;
if (sec->reloc_count == 0)
return;
rela_hdr = &((struct bfd_elf_section_data*)sec->used_by_bfd)->rel_hdr;
rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
rela_hdr->contents = (void *) bfd_alloc (abfd, rela_hdr->sh_size);
if (rela_hdr->contents == ((void *)0))
{
*failedp = true;
return;
}
if (rela_hdr->sh_type == 4)
use_rela_p = true;
else if (rela_hdr->sh_type == 9)
use_rela_p = false;
else
_bfd_abort ("elfcode.h", 830, __PRETTY_FUNCTION__);
if (use_rela_p)
{
outbound_relocas = (Elf64_External_Rela *) rela_hdr->contents;
for (idx = 0; idx < sec->reloc_count; idx++)
{
Elf_Internal_Rela dst_rela;
Elf64_External_Rela *src_rela;
arelent *ptr;
asymbol *sym;
int n;
ptr = sec->orelocation[idx];
src_rela = outbound_relocas + idx;
if ((abfd->flags & (0x02 | 0x40)) == 0)
dst_rela.r_offset = ptr->address;
else
dst_rela.r_offset = ptr->address + sec->vma;
sym = *ptr->sym_ptr_ptr;
if (sym == last_sym)
n = last_sym_idx;
else if (((sym->section) == ((asection *) &bfd_abs_section)) && sym->value == 0)
n = 0;
else
{
last_sym = sym;
n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
if (n < 0)
{
*failedp = true;
return;
}
last_sym_idx = n;
}
if ((*ptr->sym_ptr_ptr)->the_bfd != ((void *)0)
&& (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
&& ! _bfd_elf_validate_reloc (abfd, ptr))
{
*failedp = true;
return;
}
dst_rela.r_info = (((bfd_vma) (n) << 32) + (bfd_vma) (ptr->howto->type));
dst_rela.r_addend = ptr->addend;
bfd_elf64_swap_reloca_out (abfd, &dst_rela, src_rela);
}
}
else
{
outbound_relocs = (Elf64_External_Rel *) rela_hdr->contents;
for (idx = 0; idx < sec->reloc_count; idx++)
{
Elf_Internal_Rel dst_rel;
Elf64_External_Rel *src_rel;
arelent *ptr;
int n;
asymbol *sym;
ptr = sec->orelocation[idx];
sym = *ptr->sym_ptr_ptr;
src_rel = outbound_relocs + idx;
if ((abfd->flags & (0x02 | 0x40)) == 0)
dst_rel.r_offset = ptr->address;
else
dst_rel.r_offset = ptr->address + sec->vma;
if (sym == last_sym)
n = last_sym_idx;
else if (((sym->section) == ((asection *) &bfd_abs_section)) && sym->value == 0)
n = 0;
else
{
last_sym = sym;
n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
if (n < 0)
{
*failedp = true;
return;
}
last_sym_idx = n;
}
if ((*ptr->sym_ptr_ptr)->the_bfd != ((void *)0)
&& (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
&& ! _bfd_elf_validate_reloc (abfd, ptr))
{
*failedp = true;
return;
}
dst_rel.r_info = (((bfd_vma) (n) << 32) + (bfd_vma) (ptr->howto->type));
bfd_elf64_swap_reloc_out (abfd, &dst_rel, src_rel);
}
}
}
int
bfd_elf64_write_out_phdrs (abfd, phdr, count)
bfd *abfd;
const Elf_Internal_Phdr *phdr;
unsigned int count;
{
while (count--)
{
Elf64_External_Phdr extphdr;
bfd_elf64_swap_phdr_out (abfd, phdr, &extphdr);
if (bfd_bwrite (&extphdr, (bfd_size_type) sizeof (Elf64_External_Phdr),
abfd) != sizeof (Elf64_External_Phdr))
return -1;
phdr++;
}
return 0;
}
boolean
bfd_elf64_write_shdrs_and_ehdr (abfd)
bfd *abfd;
{
Elf64_External_Ehdr x_ehdr;
Elf_Internal_Ehdr *i_ehdrp;
Elf64_External_Shdr *x_shdrp;
Elf_Internal_Shdr **i_shdrp;
unsigned int count;
bfd_size_type amt;
i_ehdrp = (((abfd) -> tdata.elf_obj_data) -> elf_header);
i_shdrp = (((abfd) -> tdata.elf_obj_data) -> elf_sect_ptr);
elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
amt = sizeof (x_ehdr);
if (bfd_seek (abfd, (file_ptr) 0, 0) != 0
|| bfd_bwrite ((void *) & x_ehdr, amt, abfd) != amt)
return false;
amt = sizeof (*x_shdrp) * i_ehdrp->e_shnum;
x_shdrp = (Elf64_External_Shdr *) bfd_alloc (abfd, amt);
if (!x_shdrp)
return false;
for (count = 0; count < i_ehdrp->e_shnum; count++)
{
elf_swap_shdr_out (abfd, i_shdrp[count], x_shdrp + count);
}
amt = i_ehdrp->e_shnum;
amt *= sizeof (*x_shdrp);
if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, 0) != 0
|| bfd_bwrite ((void *) x_shdrp, amt, abfd) != amt)
return false;
return true;
}
long
bfd_elf64_slurp_symbol_table (abfd, symptrs, dynamic)
bfd *abfd;
asymbol **symptrs;
boolean dynamic;
{
Elf_Internal_Shdr *hdr;
Elf_Internal_Shdr *verhdr;
unsigned long symcount;
elf_symbol_type *sym;
elf_symbol_type *symbase;
Elf_Internal_Sym i_sym;
Elf64_External_Sym *x_symp = ((void *)0);
Elf_External_Versym *x_versymp = ((void *)0);
bfd_size_type amt;
# 1040 "elfcode.h"
if (! dynamic)
{
hdr = &((abfd) -> tdata.elf_obj_data)->symtab_hdr;
verhdr = ((void *)0);
}
else
{
hdr = &((abfd) -> tdata.elf_obj_data)->dynsymtab_hdr;
if ((((abfd) -> tdata.elf_obj_data) -> dynversym_section) == 0)
verhdr = ((void *)0);
else
verhdr = &((abfd) -> tdata.elf_obj_data)->dynversym_hdr;
if ((((abfd) -> tdata.elf_obj_data)->dynverdef_section != 0
&& ((abfd) -> tdata.elf_obj_data)->verdef == ((void *)0))
|| (((abfd) -> tdata.elf_obj_data)->dynverref_section != 0
&& ((abfd) -> tdata.elf_obj_data)->verref == ((void *)0)))
{
if (! _bfd_elf_slurp_version_tables (abfd))
return -1;
}
}
if (bfd_seek (abfd, hdr->sh_offset, 0) != 0)
return -1;
symcount = hdr->sh_size / sizeof (Elf64_External_Sym);
if (symcount == 0)
sym = symbase = ((void *)0);
else
{
unsigned long i;
if (bfd_seek (abfd, hdr->sh_offset, 0) != 0)
return -1;
amt = symcount;
amt *= sizeof (elf_symbol_type);
symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
if (symbase == (elf_symbol_type *) ((void *)0))
return -1;
sym = symbase;
amt = symcount;
amt *= sizeof (Elf64_External_Sym);
x_symp = (Elf64_External_Sym *) bfd_malloc (amt);
if (x_symp == ((void *)0) && symcount != 0)
goto error_return;
if (bfd_bread ((void *) x_symp, amt, abfd) != amt)
goto error_return;
if (verhdr != ((void *)0)
&& verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
{
(*_bfd_error_handler)
(dcgettext ("bfd", "%s: version count (%ld) does not match symbol count (%ld)", __LC_MESSAGES),
abfd->filename,
(long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
symcount);
verhdr = ((void *)0);
}
if (verhdr != ((void *)0))
{
if (bfd_seek (abfd, verhdr->sh_offset, 0) != 0)
goto error_return;
x_versymp = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
if (x_versymp == ((void *)0) && verhdr->sh_size != 0)
goto error_return;
if (bfd_bread ((void *) x_versymp, verhdr->sh_size, abfd)
!= verhdr->sh_size)
goto error_return;
}
for (i = 1; i < symcount; i++)
{
bfd_elf64_swap_symbol_in (abfd, x_symp + i, &i_sym);
memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym));
sym->symbol.the_bfd = abfd;
sym->symbol.name = bfd_elf_string_from_elf_section (abfd,
hdr->sh_link,
i_sym.st_name);
sym->symbol.value = i_sym.st_value;
if (i_sym.st_shndx > 0 && i_sym.st_shndx < 0xFF00)
{
sym->symbol.section = bfd_section_from_elf_index (abfd,
i_sym.st_shndx);
if (sym->symbol.section == ((void *)0))
{
sym->symbol.section = ((asection *) &bfd_abs_section);
}
}
else if (i_sym.st_shndx == 0xFFF1)
{
sym->symbol.section = ((asection *) &bfd_abs_section);
}
else if (i_sym.st_shndx == 0xFFF2)
{
sym->symbol.section = ((asection *) &bfd_com_section);
sym->symbol.value = i_sym.st_size;
}
else if (i_sym.st_shndx == 0)
{
sym->symbol.section = ((asection *) &bfd_und_section);
}
else
sym->symbol.section = ((asection *) &bfd_abs_section);
if ((abfd->flags & (0x02 | 0x40)) != 0)
sym->symbol.value -= sym->symbol.section->vma;
switch ((((unsigned int)(i_sym.st_info)) >> 4))
{
case 0:
sym->symbol.flags |= 0x01;
break;
case 1:
if (i_sym.st_shndx != 0
&& i_sym.st_shndx != 0xFFF2)
sym->symbol.flags |= 0x02;
break;
case 2:
sym->symbol.flags |= 0x80;
break;
}
switch (((i_sym.st_info) & 0xF))
{
case 3:
sym->symbol.flags |= 0x100 | 0x08;
break;
case 4:
sym->symbol.flags |= 0x4000 | 0x08;
break;
case 2:
sym->symbol.flags |= 0x10;
break;
case 1:
sym->symbol.flags |= 0x10000;
break;
}
if (dynamic)
sym->symbol.flags |= 0x8000;
if (x_versymp != ((void *)0))
{
Elf_Internal_Versym iversym;
_bfd_elf_swap_versym_in (abfd, x_versymp + i, &iversym);
sym->version = iversym.vs_vers;
}
{
struct elf_backend_data *ebd = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
if (ebd->elf_backend_symbol_processing)
(*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
}
sym++;
}
}
{
struct elf_backend_data *ebd = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
if (ebd->elf_backend_symbol_table_processing)
(*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
}
symcount = sym - symbase;
if (symptrs)
{
long l = symcount;
sym = symbase;
while (l-- > 0)
{
*symptrs++ = &sym->symbol;
sym++;
}
*symptrs = 0;
}
if (x_versymp != ((void *)0))
free (x_versymp);
if (x_symp != ((void *)0))
free (x_symp);
return symcount;
error_return:
if (x_versymp != ((void *)0))
free (x_versymp);
if (x_symp != ((void *)0))
free (x_symp);
return -1;
}
static boolean
elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count,
relents, symbols, dynamic)
bfd *abfd;
asection *asect;
Elf_Internal_Shdr *rel_hdr;
bfd_size_type reloc_count;
arelent *relents;
asymbol **symbols;
boolean dynamic;
{
struct elf_backend_data * const ebd = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
void * allocated = ((void *)0);
bfd_byte *native_relocs;
arelent *relent;
unsigned int i;
int entsize;
allocated = (void *) bfd_malloc (rel_hdr->sh_size);
if (allocated == ((void *)0))
goto error_return;
if (bfd_seek (abfd, rel_hdr->sh_offset, 0) != 0
|| (bfd_bread (allocated, rel_hdr->sh_size, abfd)
!= rel_hdr->sh_size))
goto error_return;
native_relocs = (bfd_byte *) allocated;
entsize = rel_hdr->sh_entsize;
{ if (!(entsize == sizeof (Elf64_External_Rel) || entsize == sizeof (Elf64_External_Rela))) bfd_assert("elfcode.h",1301); };
for (i = 0, relent = relents;
i < reloc_count;
i++, relent++, native_relocs += entsize)
{
Elf_Internal_Rela rela;
Elf_Internal_Rel rel;
if (entsize == sizeof (Elf64_External_Rela))
bfd_elf64_swap_reloca_in (abfd, (Elf64_External_Rela *) native_relocs, &rela);
else
{
bfd_elf64_swap_reloc_in (abfd, (Elf64_External_Rel *) native_relocs, &rel);
rela.r_offset = rel.r_offset;
rela.r_info = rel.r_info;
rela.r_addend = 0;
}
if ((abfd->flags & (0x02 | 0x40)) == 0 || dynamic)
relent->address = rela.r_offset;
else
relent->address = rela.r_offset - asect->vma;
if (((rela.r_info) >> 32) == 0)
relent->sym_ptr_ptr = ((asection *) &bfd_abs_section)->symbol_ptr_ptr;
else
{
asymbol **ps, *s;
ps = symbols + ((rela.r_info) >> 32) - 1;
s = *ps;
if ((s->flags & 0x100) == 0)
relent->sym_ptr_ptr = ps;
else
relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
}
relent->addend = rela.r_addend;
if (entsize == sizeof (Elf64_External_Rela))
(*ebd->elf_info_to_howto) (abfd, relent, &rela);
else
(*ebd->elf_info_to_howto_rel) (abfd, relent, &rel);
}
if (allocated != ((void *)0))
free (allocated);
return true;
error_return:
if (allocated != ((void *)0))
free (allocated);
return false;
}
boolean
bfd_elf64_slurp_reloc_table (abfd, asect, symbols, dynamic)
bfd *abfd;
asection *asect;
asymbol **symbols;
boolean dynamic;
{
struct bfd_elf_section_data * const d = ((struct bfd_elf_section_data*)asect->used_by_bfd);
Elf_Internal_Shdr *rel_hdr;
Elf_Internal_Shdr *rel_hdr2;
bfd_size_type reloc_count;
bfd_size_type reloc_count2;
arelent *relents;
bfd_size_type amt;
if (asect->relocation != ((void *)0))
return true;
if (! dynamic)
{
if ((asect->flags & 0x004) == 0
|| asect->reloc_count == 0)
return true;
rel_hdr = &d->rel_hdr;
reloc_count = ((rel_hdr)->sh_size / (rel_hdr)->sh_entsize);
rel_hdr2 = d->rel_hdr2;
reloc_count2 = (rel_hdr2 ? ((rel_hdr2)->sh_size / (rel_hdr2)->sh_entsize) : 0);
{ if (!(asect->reloc_count == reloc_count + reloc_count2)) bfd_assert("elfcode.h",1395); };
{ if (!(asect->rel_filepos == rel_hdr->sh_offset || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset))) bfd_assert("elfcode.h",1397); };
}
else
{
if (asect->_raw_size == 0)
return true;
rel_hdr = &d->this_hdr;
reloc_count = ((rel_hdr)->sh_size / (rel_hdr)->sh_entsize);
rel_hdr2 = ((void *)0);
reloc_count2 = 0;
}
amt = (reloc_count + reloc_count2) * sizeof (arelent);
relents = (arelent *) bfd_alloc (abfd, amt);
if (relents == ((void *)0))
return false;
if (!elf_slurp_reloc_table_from_section (abfd, asect,
rel_hdr, reloc_count,
relents,
symbols, dynamic))
return false;
if (rel_hdr2
&& !elf_slurp_reloc_table_from_section (abfd, asect,
rel_hdr2, reloc_count2,
relents + reloc_count,
symbols, dynamic))
return false;
asect->relocation = relents;
return true;
}
# 1552 "elfcode.h"
# 1 "elfcore.h" 1
# 21 "elfcore.h"
char*
bfd_elf64_core_file_failing_command (abfd)
bfd *abfd;
{
return ((abfd) -> tdata.elf_obj_data)->core_command;
}
int
bfd_elf64_core_file_failing_signal (abfd)
bfd *abfd;
{
return ((abfd) -> tdata.elf_obj_data)->core_signal;
}
boolean
bfd_elf64_core_file_matches_executable_p (core_bfd, exec_bfd)
bfd *core_bfd;
bfd *exec_bfd;
{
char* corename;
if (core_bfd->xvec != exec_bfd->xvec)
{
bfd_set_error (bfd_error_system_call);
return false;
}
corename = ((core_bfd) -> tdata.elf_obj_data)->core_program;
if (corename != ((void *)0))
{
const char* execname = strrchr (exec_bfd->filename, '/');
execname = execname ? execname + 1 : exec_bfd->filename;
if (__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (execname) && __builtin_constant_p (corename) && (__s1_len = strlen (execname), __s2_len = strlen (corename), (!((size_t)(const void *)((execname) + 1) - (size_t)(const void *)(execname) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((corename) + 1) - (size_t)(const void *)(corename) == 1) || __s2_len >= 4)) ? memcmp ((__const char *) (execname), (__const char *) (corename), (__s1_len < __s2_len ? __s1_len : __s2_len) + 1) : (__builtin_constant_p (execname) && ((size_t)(const void *)((execname) + 1) - (size_t)(const void *)(execname) == 1) && (__s1_len = strlen (execname), __s1_len < 4) ? (__builtin_constant_p (corename) && ((size_t)(const void *)((corename) + 1) - (size_t)(const void *)(corename) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (execname))[0] - ((__const unsigned char *) (__const char *)(corename))[0]); if (__s1_len > 0 && __result!
== 0) { __result = (((__const unsigned char *) (__const char *) (execname))[1] - ((__const unsigned char *) (__const char *) (corename))[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (execname))[2] - ((__const unsigned char *) (__const char *) (corename))[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (execname))[3] - ((__const unsigned char *) (__const char *) (corename))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) (corename); register int __result = (((__const unsigned char *) (__const char *) (execname))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (execname))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (execname))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (!
((__const unsigned char *) (__const char *) (execname))[3] - !
__s2[3]); } } __result; }))) : (__builtin_constant_p (corename) && ((size_t)(const void *)((corename) + 1) - (size_t)(const void *)(corename) == 1) && (__s2_len = strlen (corename), __s2_len < 4) ? (__builtin_constant_p (execname) && ((size_t)(const void *)((execname) + 1) - (size_t)(const void *)(execname) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (execname))[0] - ((__const unsigned char *) (__const char *)(corename))[0]); if (__s2_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (execname))[1] - ((__const unsigned char *) (__const char *) (corename))[1]); if (__s2_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (execname))[2] - ((__const unsigned char *) (__const char *) (corename))[2]); if (__s2_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (execname))[3] - ((__const unsigned char *) (__const char *) (corename))[3]!
); } } __result; })) : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (execname); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) (corename))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) (corename))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) (corename))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) (corename))[3]); } } __result; }))) : strcmp (execname, corename)))); }) != 0)
return false;
}
return true;
}
# 78 "elfcore.h"
const bfd_target *
bfd_elf64_core_file_p (abfd)
bfd *abfd;
{
Elf64_External_Ehdr x_ehdr;
Elf_Internal_Ehdr *i_ehdrp;
Elf_Internal_Phdr *i_phdrp = ((void *)0);
unsigned int phindex;
struct elf_backend_data *ebd;
struct elf_obj_tdata *preserved_tdata = ((abfd) -> tdata.elf_obj_data);
struct sec *preserved_sections = abfd->sections;
unsigned int preserved_section_count = abfd->section_count;
enum bfd_architecture previous_arch = bfd_get_arch (abfd);
unsigned long previous_mach = bfd_get_mach (abfd);
struct elf_obj_tdata *new_tdata = ((void *)0);
bfd_size_type amt;
abfd->sections = ((void *)0);
abfd->section_count = 0;
if (bfd_bread ((void *) &x_ehdr, (bfd_size_type) sizeof (x_ehdr), abfd)
!= sizeof (x_ehdr))
{
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return ((void *)0);
}
if (elf_file_p (&x_ehdr) == false)
goto wrong;
if (x_ehdr.e_ident[4] != 2)
goto wrong;
switch (x_ehdr.e_ident[5])
{
case 2:
if (! ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG))
goto wrong;
break;
case 1:
if (! ((abfd)->xvec->byteorder == BFD_ENDIAN_LITTLE))
goto wrong;
break;
default:
goto wrong;
}
amt = sizeof (struct elf_obj_tdata);
new_tdata = (struct elf_obj_tdata *) bfd_zalloc (abfd, amt);
if (new_tdata == ((void *)0))
return ((void *)0);
((abfd) -> tdata.elf_obj_data) = new_tdata;
i_ehdrp = (((abfd) -> tdata.elf_obj_data) -> elf_header);
elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
ebd = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
if (ebd->elf_machine_code != i_ehdrp->e_machine
&& (ebd->elf_machine_alt1 == 0
|| i_ehdrp->e_machine != ebd->elf_machine_alt1)
&& (ebd->elf_machine_alt2 == 0
|| i_ehdrp->e_machine != ebd->elf_machine_alt2))
{
const bfd_target * const *target_ptr;
if (ebd->elf_machine_code != 0)
goto wrong;
for (target_ptr = bfd_target_vector; *target_ptr != ((void *)0); target_ptr++)
{
struct elf_backend_data *back;
if ((*target_ptr)->flavour != bfd_target_elf_flavour)
continue;
back = (struct elf_backend_data *) (*target_ptr)->backend_data;
if (back->elf_machine_code == i_ehdrp->e_machine)
{
goto wrong;
}
}
}
if (i_ehdrp->e_phoff == 0 || i_ehdrp->e_type != 4)
goto wrong;
if (i_ehdrp->e_phentsize != sizeof (Elf64_External_Phdr))
goto wrong;
if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, 0) != 0)
goto wrong;
amt = sizeof (*i_phdrp) * i_ehdrp->e_phnum;
i_phdrp = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
if (!i_phdrp)
goto fail;
((abfd) -> tdata.elf_obj_data)->phdr = i_phdrp;
for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
{
Elf64_External_Phdr x_phdr;
if (bfd_bread ((void *) &x_phdr, (bfd_size_type) sizeof (x_phdr), abfd)
!= sizeof (x_phdr))
goto fail;
bfd_elf64_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
}
for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
{
if (! bfd_section_from_phdr (abfd, i_phdrp + phindex, (int) phindex))
goto fail;
}
if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
{
if (ebd->elf_machine_code != 0)
goto fail;
}
((abfd)->start_address) = i_ehdrp->e_entry;
if (ebd->elf_backend_object_p)
{
if ((*ebd->elf_backend_object_p) (abfd) == false)
goto wrong;
}
return abfd->xvec;
wrong:
# 255 "elfcore.h"
bfd_default_set_arch_mach (abfd, previous_arch, previous_mach);
bfd_set_error (bfd_error_wrong_format);
fail:
if (i_phdrp != ((void *)0))
bfd_release (abfd, i_phdrp);
if (new_tdata != ((void *)0))
bfd_release (abfd, new_tdata);
((abfd) -> tdata.elf_obj_data) = preserved_tdata;
abfd->sections = preserved_sections;
abfd->section_count = preserved_section_count;
return ((void *)0);
}
# 1553 "elfcode.h" 2
# 1 "elflink.h" 1
# 26 "elflink.h"
struct elf_info_failed
{
boolean failed;
struct bfd_link_info *info;
struct bfd_elf_version_tree *verdefs;
};
static boolean is_global_data_symbol_definition
(bfd *, Elf_Internal_Sym *);
static boolean elf_link_is_defined_archive_symbol
(bfd *, carsym *);
static boolean elf_link_add_object_symbols
(bfd *, struct bfd_link_info *);
static boolean elf_link_add_archive_symbols
(bfd *, struct bfd_link_info *);
static boolean elf_merge_symbol
(bfd *, struct bfd_link_info *, const char *, Elf_Internal_Sym *, asection **, bfd_vma *, struct elf_link_hash_entry **, boolean *, boolean *, boolean *, boolean);
static boolean elf_add_default_symbol
(bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, const char *, Elf_Internal_Sym *, asection **, bfd_vma *, boolean *, boolean, boolean);
static boolean elf_export_symbol
(struct elf_link_hash_entry *, void *);
static boolean elf_finalize_dynstr
(bfd *, struct bfd_link_info *);
static boolean elf_fix_symbol_flags
(struct elf_link_hash_entry *, struct elf_info_failed *);
static boolean elf_adjust_dynamic_symbol
(struct elf_link_hash_entry *, void *);
static boolean elf_link_find_version_dependencies
(struct elf_link_hash_entry *, void *);
static boolean elf_link_find_version_dependencies
(struct elf_link_hash_entry *, void *);
static boolean elf_link_assign_sym_version
(struct elf_link_hash_entry *, void *);
static boolean elf_collect_hash_codes
(struct elf_link_hash_entry *, void *);
static boolean elf_link_read_relocs_from_section
(bfd *, Elf_Internal_Shdr *, void *, Elf_Internal_Rela *);
static size_t compute_bucket_count
(struct bfd_link_info *);
static void elf_link_output_relocs
(bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *);
static boolean elf_link_size_reloc_section
(bfd *, Elf_Internal_Shdr *, asection *);
static void elf_link_adjust_relocs
(bfd *, Elf_Internal_Shdr *, unsigned int, struct elf_link_hash_entry **);
static int elf_link_sort_cmp1
(const void *, const void *);
static int elf_link_sort_cmp2
(const void *, const void *);
static size_t elf_link_sort_relocs
(bfd *, struct bfd_link_info *, asection **);
static boolean elf_section_ignore_discarded_relocs
(asection *);
static boolean elf_link_check_versioned_symbol
(struct bfd_link_info *, struct elf_link_hash_entry *);
static boolean
elf_link_check_versioned_symbol (info, h)
struct bfd_link_info *info;
struct elf_link_hash_entry *h;
{
boolean found = false;
bfd *undef_bfd = h->root.u.undef.abfd;
struct elf_link_loaded_list *loaded;
Elf64_External_Sym *buf = ((void *)0);
Elf_External_Versym *extversym = ((void *)0);
if ((undef_bfd->flags & 0x40) == 0
|| info->hash->creator->flavour != bfd_target_elf_flavour)
return false;
for (loaded = ((struct elf_link_hash_table *) ((info)->hash))->loaded;
loaded != ((void *)0) && !found;
loaded = loaded->next)
{
bfd *input;
Elf_Internal_Shdr *hdr;
bfd_size_type symcount;
bfd_size_type extsymcount;
bfd_size_type extsymoff;
Elf_Internal_Shdr *versymhdr;
Elf_External_Versym *ever;
Elf64_External_Sym *esym;
Elf64_External_Sym *esymend;
bfd_size_type count;
file_ptr pos;
input = loaded->abfd;
if (input == undef_bfd
|| (input->flags & 0x40) == 0
|| (((input) -> tdata.elf_obj_data) -> dynversym_section) == 0)
continue;
hdr = &((input) -> tdata.elf_obj_data)->dynsymtab_hdr;
symcount = hdr->sh_size / sizeof (Elf64_External_Sym);
if ((((input) -> tdata.elf_obj_data) -> bad_symtab))
{
extsymcount = symcount;
extsymoff = 0;
}
else
{
extsymcount = symcount - hdr->sh_info;
extsymoff = hdr->sh_info;
}
if (extsymcount == 0)
continue;
buf = ((Elf64_External_Sym *)
bfd_malloc (extsymcount * sizeof (Elf64_External_Sym)));
if (buf == ((void *)0))
goto no_memory;
pos = hdr->sh_offset + extsymoff * sizeof (Elf64_External_Sym);
count = extsymcount * sizeof (Elf64_External_Sym);
if (bfd_seek (input, pos, 0) != 0
|| bfd_bread ((void *) buf, count, input) != count)
goto error_return;
versymhdr = &((input) -> tdata.elf_obj_data)->dynversym_hdr;
extversym =
(Elf_External_Versym *) bfd_malloc (versymhdr->sh_size);
if (extversym == ((void *)0))
goto no_memory;
if (bfd_seek (input, versymhdr->sh_offset, 0) != 0
|| bfd_bread ((void *) extversym, versymhdr->sh_size, input)
!= versymhdr->sh_size)
goto error_return;
ever = extversym + extsymoff;
esymend = buf + extsymcount;
for (esym = buf; esym < esymend; esym++, ever++)
{
const char *name;
Elf_Internal_Sym sym;
Elf_Internal_Versym iver;
bfd_elf64_swap_symbol_in (input, esym, &sym);
if ((((unsigned int)(sym.st_info)) >> 4) == 0
|| sym.st_shndx == 0)
continue;
name = bfd_elf_string_from_elf_section (input,
hdr->sh_link,
sym.st_name);
if (__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (name) && __builtin_constant_p (h->root.root.string) && (__s1_len = strlen (name), __s2_len = strlen (h->root.root.string), (!((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((h->root.root.string) + 1) - (size_t)(const void *)(h->root.root.string) == 1) || __s2_len >= 4)) ? memcmp ((__const char *) (name), (__const char *) (h->root.root.string), (__s1_len < __s2_len ? __s1_len : __s2_len) + 1) : (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) && (__s1_len = strlen (name), __s1_len < 4) ? (__builtin_constant_p (h->root.root.string) && ((size_t)(const void *)((h->root.root.string) + 1) - (size_t)(const void *)(h->root.root.string) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (name))[0] - ((__const unsigned char *) (__const !
char *)(h->root.root.string))[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[1] - ((__const unsigned char *) (__const char *) (h->root.root.string))[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[2] - ((__const unsigned char *) (__const char *) (h->root.root.string))[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (name))[3] - ((__const unsigned char *) (__const char *) (h->root.root.string))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) (h->root.root.string); register int __result = (((__const unsigned char *) (__const char *) (name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__c!
onst char *) (name))[2] - __s2[2]); if (__s1_len > 2 && __res!
ult == 0) __result = (((__const unsigned char *) (__const char *) (name))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (h->root.root.string) && ((size_t)(const void *)((h->root.root.string) + 1) - (size_t)(const void *)(h->root.root.string) == 1) && (__s2_len = strlen (h->root.root.string), __s2_len < 4) ? (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (name))[0] - ((__const unsigned char *) (__const char *)(h->root.root.string))[0]); if (__s2_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[1] - ((__const unsigned char *) (__const char *) (h->root.root.string))[1]); if (__s2_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[2] - ((__const unsigned char *) (__const char *) (h->root.root.string))[2]); if (__s2_len > 2 && __result == 0)!
__result = (((__const unsigned char *) (__const char *) (name))[3] - ((__const unsigned char *) (__const char *) (h->root.root.string))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (name); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) (h->root.root.string))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) (h->root.root.string))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) (h->root.root.string))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) (h->root.root.string))[3]); } } __result; }))) : strcmp (name, h->root.root.string)))); }) != 0)
continue;
_bfd_elf_swap_versym_in (input, ever, &iver);
if ((iver.vs_vers & 0x8000) == 0)
{
(*_bfd_error_handler)
(dcgettext ("bfd", "%s: defined in %s", __LC_MESSAGES), name,
((char *) (input)->filename));
bfd_set_error (bfd_error_bad_value);
goto error_return;
}
if ((iver.vs_vers & 0x7fff) == 2)
{
found = true;
break;
}
}
free (buf);
free (extversym);
}
return found;
no_memory:
bfd_set_error (bfd_error_no_memory);
error_return:
if (buf != ((void *)0))
free (buf);
if (extversym != ((void *)0))
free (extversym);
return found;
}
boolean
bfd_elf64_bfd_link_add_symbols (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
switch (((abfd)->format))
{
case bfd_object:
return elf_link_add_object_symbols (abfd, info);
case bfd_archive:
return elf_link_add_archive_symbols (abfd, info);
default:
bfd_set_error (bfd_error_wrong_format);
return false;
}
}
static boolean
is_global_data_symbol_definition (abfd, sym)
bfd * abfd __attribute__ ((__unused__));
Elf_Internal_Sym * sym;
{
if ((((unsigned int)(sym->st_info)) >> 4) != 1
&& (((unsigned int)(sym->st_info)) >> 4) < 10)
return false;
if (((sym->st_info) & 0xF) == 2)
return false;
if (sym->st_shndx == 0)
return false;
if (sym->st_shndx == 0xFFF2)
return false;
if (sym->st_shndx >= 0xFF00 && sym->st_shndx < 0xFFF1)
return false;
return true;
}
static boolean
elf_link_is_defined_archive_symbol (abfd, symdef)
bfd * abfd;
carsym * symdef;
{
Elf_Internal_Shdr * hdr;
Elf64_External_Sym * esym;
Elf64_External_Sym * esymend;
Elf64_External_Sym * buf = ((void *)0);
bfd_size_type symcount;
bfd_size_type extsymcount;
bfd_size_type extsymoff;
boolean result = false;
file_ptr pos;
bfd_size_type amt;
abfd = _bfd_get_elt_at_filepos (abfd, symdef->file_offset);
if (abfd == (bfd *) ((void *)0))
return false;
if (! bfd_check_format (abfd, bfd_object))
return false;
if (abfd->archive_pass)
return false;
if ((abfd->flags & 0x40) == 0 || (((abfd) -> tdata.elf_obj_data) -> dynsymtab_section) == 0)
hdr = &((abfd) -> tdata.elf_obj_data)->symtab_hdr;
else
hdr = &((abfd) -> tdata.elf_obj_data)->dynsymtab_hdr;
symcount = hdr->sh_size / sizeof (Elf64_External_Sym);
if ((((abfd) -> tdata.elf_obj_data) -> bad_symtab))
{
extsymcount = symcount;
extsymoff = 0;
}
else
{
extsymcount = symcount - hdr->sh_info;
extsymoff = hdr->sh_info;
}
amt = extsymcount * sizeof (Elf64_External_Sym);
buf = (Elf64_External_Sym *) bfd_malloc (amt);
if (buf == ((void *)0) && extsymcount != 0)
return false;
pos = hdr->sh_offset + extsymoff * sizeof (Elf64_External_Sym);
if (bfd_seek (abfd, pos, 0) != 0
|| bfd_bread ((void *) buf, amt, abfd) != amt)
{
free (buf);
return false;
}
esymend = buf + extsymcount;
for (esym = buf;
esym < esymend;
esym++)
{
Elf_Internal_Sym sym;
const char * name;
bfd_elf64_swap_symbol_in (abfd, esym, & sym);
name = bfd_elf_string_from_elf_section (abfd, hdr->sh_link, sym.st_name);
if (name == (const char *) ((void *)0))
break;
if (__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (name) && __builtin_constant_p (symdef->name) && (__s1_len = strlen (name), __s2_len = strlen (symdef->name), (!((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((symdef->name) + 1) - (size_t)(const void *)(symdef->name) == 1) || __s2_len >= 4)) ? memcmp ((__const char *) (name), (__const char *) (symdef->name), (__s1_len < __s2_len ? __s1_len : __s2_len) + 1) : (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) && (__s1_len = strlen (name), __s1_len < 4) ? (__builtin_constant_p (symdef->name) && ((size_t)(const void *)((symdef->name) + 1) - (size_t)(const void *)(symdef->name) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (name))[0] - ((__const unsigned char *) (__const char *)(symdef->name))[0]); if (__s1_len > 0 && __result == !
0) { __result = (((__const unsigned char *) (__const char *) (name))[1] - ((__const unsigned char *) (__const char *) (symdef->name))[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[2] - ((__const unsigned char *) (__const char *) (symdef->name))[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (name))[3] - ((__const unsigned char *) (__const char *) (symdef->name))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) (symdef->name); register int __result = (((__const unsigned char *) (__const char *) (name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const un!
signed char *) (__const char *) (name))[3] - __s2[3]); } } __!
result; }))) : (__builtin_constant_p (symdef->name) && ((size_t)(const void *)((symdef->name) + 1) - (size_t)(const void *)(symdef->name) == 1) && (__s2_len = strlen (symdef->name), __s2_len < 4) ? (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (name))[0] - ((__const unsigned char *) (__const char *)(symdef->name))[0]); if (__s2_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[1] - ((__const unsigned char *) (__const char *) (symdef->name))[1]); if (__s2_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[2] - ((__const unsigned char *) (__const char *) (symdef->name))[2]); if (__s2_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (name))[3] - ((__const unsigned char *) (__const char *) (symdef->name))[3]); } } __res!
ult; })) : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (name); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) (symdef->name))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) (symdef->name))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) (symdef->name))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) (symdef->name))[3]); } } __result; }))) : strcmp (name, symdef->name)))); }) == 0)
{
result = is_global_data_symbol_definition (abfd, & sym);
break;
}
}
free (buf);
return result;
}
# 405 "elflink.h"
static boolean
elf_link_add_archive_symbols (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
symindex c;
boolean *defined = ((void *)0);
boolean *included = ((void *)0);
carsym *symdefs;
boolean loop;
bfd_size_type amt;
if (! ((abfd)->has_armap))
{
if (bfd_openr_next_archived_file (abfd, (bfd *) ((void *)0)) == ((void *)0))
return true;
bfd_set_error (bfd_error_no_armap);
return false;
}
c = ((abfd)->tdata.aout_ar_data)->symdef_count;
if (c == 0)
return true;
amt = c;
amt *= sizeof (boolean);
defined = (boolean *) bfd_malloc (amt);
included = (boolean *) bfd_malloc (amt);
if (defined == (boolean *) ((void *)0) || included == (boolean *) ((void *)0))
goto error_return;
(__extension__ (__builtin_constant_p (0) && (0) == '\0' ? ({ void *__s = (defined); __builtin_memset (__s, '\0', (size_t) amt); __s; }) : memset (defined, 0, (size_t) amt)));
(__extension__ (__builtin_constant_p (0) && (0) == '\0' ? ({ void *__s = (included); __builtin_memset (__s, '\0', (size_t) amt); __s; }) : memset (included, 0, (size_t) amt)));
symdefs = ((abfd)->tdata.aout_ar_data)->symdefs;
do
{
file_ptr last;
symindex i;
carsym *symdef;
carsym *symdefend;
loop = false;
last = -1;
symdef = symdefs;
symdefend = symdef + c;
for (i = 0; symdef < symdefend; symdef++, i++)
{
struct elf_link_hash_entry *h;
bfd *element;
struct bfd_link_hash_entry *undefs_tail;
symindex mark;
if (defined[i] || included[i])
continue;
if (symdef->file_offset == last)
{
included[i] = true;
continue;
}
h = ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (symdef->name), (false), (false), (false)));
if (h == ((void *)0))
{
char *p, *copy;
p = (__extension__ (__builtin_constant_p ('@') && ('@') == '\0' ? (char *) __rawmemchr (symdef->name, '@') : strchr (symdef->name, '@')));
if (p == ((void *)0) || p[1] != '@')
continue;
copy = bfd_alloc (abfd, strlen (symdef->name));
if (copy == ((void *)0))
goto error_return;
memcpy (copy, symdef->name,
(size_t) (p - symdef->name + 1));
(__extension__ (__builtin_constant_p (&symdef->name [p - symdef->name + 2]) ? (((size_t)(const void *)((&symdef->name [p - symdef->name + 2]) + 1) - (size_t)(const void *)(&symdef->name [p - symdef->name + 2]) == 1) && strlen (&symdef->name [p - symdef->name + 2]) + 1 <= 8 ? __strcpy_small (© [p - symdef->name + 1], __extension__ ((__STRING2_COPY_ARR2) { { ((__const char *) (&symdef->name [p - symdef->name + 2]))[0], '\0' } }), __extension__ ((__STRING2_COPY_ARR3) { { ((__const char *) (&symdef->name [p - symdef->name + 2]))[0], ((__const char *) (&symdef->name [p - symdef->name + 2]))[1], '\0' } }), __extension__ ((__STRING2_COPY_ARR4) { { ((__const char *) (&symdef->name [p - symdef->name + 2]))[0], ((__const char *) (&symdef->name [p - symdef->name + 2]))[1], ((__const char *) (&symdef->name [p - symdef->name + 2]))[2], '\0' } }), __extension__ ((__STRING2_COPY_ARR5) { { ((__const char *) (&symdef->name [p - symdef->name + 2]))[0], ((__const char *) (&sy!
mdef->name [p - symdef->name + 2]))[1], ((__const char *) (&symdef->name [p - symdef->name + 2]))[2], ((__const char *) (&symdef->name [p - symdef->name + 2]))[3], '\0' } }), __extension__ ((__STRING2_COPY_ARR6) { { ((__const char *) (&symdef->name [p - symdef->name + 2]))[0], ((__const char *) (&symdef->name [p - symdef->name + 2]))[1], ((__const char *) (&symdef->name [p - symdef->name + 2]))[2], ((__const char *) (&symdef->name [p - symdef->name + 2]))[3], ((__const char *) (&symdef->name [p - symdef->name + 2]))[4], '\0' } }), __extension__ ((__STRING2_COPY_ARR7) { { ((__const char *) (&symdef->name [p - symdef->name + 2]))[0], ((__const char *) (&symdef->name [p - symdef->name + 2]))[1], ((__const char *) (&symdef->name [p - symdef->name + 2]))[2], ((__const char *) (&symdef->name [p - symdef->name + 2]))[3], ((__const char *) (&symdef->name [p - symdef->name + 2]))[4], ((__const char *) (&symdef->name [p - symdef->name + 2]))[5], '\0' } }), __extension__ ((__STRING2_CO!
PY_ARR8) { { ((__const char *) (&symdef->name [p - symdef->na!
me + 2]))[0], ((__const char *) (&symdef->name [p - symdef->name + 2]))[1], ((__const char *) (&symdef->name [p - symdef->name + 2]))[2], ((__const char *) (&symdef->name [p - symdef->name + 2]))[3], ((__const char *) (&symdef->name [p - symdef->name + 2]))[4], ((__const char *) (&symdef->name [p - symdef->name + 2]))[5], ((__const char *) (&symdef->name [p - symdef->name + 2]))[6], '\0' } }), strlen (&symdef->name [p - symdef->name + 2]) + 1) : (char *) memcpy (© [p - symdef->name + 1], &symdef->name [p - symdef->name + 2], strlen (&symdef->name [p - symdef->name + 2]) + 1)) : strcpy (© [p - symdef->name + 1], &symdef->name [p - symdef->name + 2])));
h = ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (copy), (false), (false), (false)));
if (h == ((void *)0))
{
copy[p - symdef->name] = '\0';
h = ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (copy), (false), (false), (false)));
}
bfd_release (abfd, copy);
}
if (h == ((void *)0))
continue;
if (h->root.type == bfd_link_hash_common)
{
# 529 "elflink.h"
if (! elf_link_is_defined_archive_symbol (abfd, symdef))
continue;
}
else if (h->root.type != bfd_link_hash_undefined)
{
if (h->root.type != bfd_link_hash_undefweak)
defined[i] = true;
continue;
}
element = _bfd_get_elt_at_filepos (abfd, symdef->file_offset);
if (element == (bfd *) ((void *)0))
goto error_return;
if (! bfd_check_format (element, bfd_object))
goto error_return;
if (element->archive_pass != 0)
{
bfd_set_error (bfd_error_bad_value);
goto error_return;
}
element->archive_pass = 1;
undefs_tail = info->hash->undefs_tail;
if (! (*info->callbacks->add_archive_element) (info, element,
symdef->name))
goto error_return;
if (! elf_link_add_object_symbols (element, info))
goto error_return;
# 572 "elflink.h"
if (undefs_tail != info->hash->undefs_tail)
loop = true;
mark = i;
do
{
included[mark] = true;
if (mark == 0)
break;
--mark;
}
while (symdefs[mark].file_offset == symdef->file_offset);
last = symdef->file_offset;
}
}
while (loop);
free (defined);
free (included);
return true;
error_return:
if (defined != (boolean *) ((void *)0))
free (defined);
if (included != (boolean *) ((void *)0))
free (included);
return false;
}
# 619 "elflink.h"
static boolean
elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash,
override, type_change_ok, size_change_ok, dt_needed)
bfd *abfd;
struct bfd_link_info *info;
const char *name;
Elf_Internal_Sym *sym;
asection **psec;
bfd_vma *pvalue;
struct elf_link_hash_entry **sym_hash;
boolean *override;
boolean *type_change_ok;
boolean *size_change_ok;
boolean dt_needed;
{
asection *sec;
struct elf_link_hash_entry *h;
int bind;
bfd *oldbfd;
boolean newdyn, olddyn, olddef, newdef, newdyncommon, olddyncommon;
*override = false;
sec = *psec;
bind = (((unsigned int)(sym->st_info)) >> 4);
if (! ((sec) == ((asection *) &bfd_und_section)))
h = ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (name), (true), (false), (false)));
else
h = ((struct elf_link_hash_entry *)
bfd_wrapped_link_hash_lookup (abfd, info, name, true, false, false));
if (h == ((void *)0))
return false;
*sym_hash = h;
if (info->hash->creator != abfd->xvec)
return true;
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;
if (h->root.type == bfd_link_hash_new)
{
h->elf_link_hash_flags &=~ 0400;
return true;
}
switch (h->root.type)
{
default:
oldbfd = ((void *)0);
break;
case bfd_link_hash_undefined:
case bfd_link_hash_undefweak:
oldbfd = h->root.u.undef.abfd;
break;
case bfd_link_hash_defined:
case bfd_link_hash_defweak:
oldbfd = h->root.u.def.section->owner;
break;
case bfd_link_hash_common:
oldbfd = h->root.u.c.p->section->owner;
break;
}
if (abfd == oldbfd
&& ((abfd->flags & 0x40) == 0
|| (h->elf_link_hash_flags & 02) == 0))
return true;
if ((abfd->flags & 0x40) != 0)
newdyn = true;
else
newdyn = false;
if (oldbfd != ((void *)0))
olddyn = (oldbfd->flags & 0x40) != 0;
else
{
asection *hsec;
switch (h->root.type)
{
default:
hsec = ((void *)0);
break;
case bfd_link_hash_defined:
case bfd_link_hash_defweak:
hsec = h->root.u.def.section;
break;
case bfd_link_hash_common:
hsec = h->root.u.c.p->section;
break;
}
if (hsec == ((void *)0))
olddyn = false;
else
olddyn = (hsec->symbol->flags & 0x8000) != 0;
}
if (((sec) == ((asection *) &bfd_und_section)) || (((sec)->flags & 0x8000) != 0))
newdef = false;
else
newdef = true;
if (h->root.type == bfd_link_hash_undefined
|| h->root.type == bfd_link_hash_undefweak
|| h->root.type == bfd_link_hash_common)
olddef = false;
else
olddef = true;
# 785 "elflink.h"
if (newdyn
&& newdef
&& (sec->flags & 0x001) != 0
&& (sec->flags & 0x002) == 0
&& sym->st_size > 0
&& bind != 2
&& ((sym->st_info) & 0xF) != 2)
newdyncommon = true;
else
newdyncommon = false;
if (olddyn
&& olddef
&& h->root.type == bfd_link_hash_defined
&& (h->elf_link_hash_flags & 010) != 0
&& (h->root.u.def.section->flags & 0x001) != 0
&& (h->root.u.def.section->flags & 0x002) == 0
&& h->size > 0
&& h->type != 2)
olddyncommon = true;
else
olddyncommon = false;
if ((! dt_needed && h->root.type == bfd_link_hash_defweak)
|| h->root.type == bfd_link_hash_undefweak
|| bind == 2)
*type_change_ok = true;
if (*type_change_ok
|| h->root.type == bfd_link_hash_undefined)
*size_change_ok = true;
if (olddyncommon
&& newdyncommon
&& sym->st_size != h->size)
{
if (! ((*info->callbacks->multiple_common)
(info, h->root.root.string, oldbfd, bfd_link_hash_common,
h->size, abfd, bfd_link_hash_common, sym->st_size)))
return false;
if (sym->st_size > h->size)
h->size = sym->st_size;
*size_change_ok = true;
}
# 869 "elflink.h"
if (newdyn
&& newdef
&& (olddef
|| (h->root.type == bfd_link_hash_common
&& (bind == 2
|| ((sym->st_info) & 0xF) == 2)))
&& (h->root.type != bfd_link_hash_defweak
|| dt_needed
|| bind == 2))
{
*override = true;
newdef = false;
newdyncommon = false;
*psec = sec = ((asection *) &bfd_und_section);
*size_change_ok = true;
if (h->root.type == bfd_link_hash_common)
*type_change_ok = true;
}
if (newdyncommon
&& h->root.type == bfd_link_hash_common)
{
*override = true;
newdef = false;
newdyncommon = false;
*pvalue = sym->st_size;
*psec = sec = ((asection *) &bfd_com_section);
*size_change_ok = true;
}
# 926 "elflink.h"
if (! newdyn
&& (newdef
|| ((((sec)->flags & 0x8000) != 0)
&& (h->root.type == bfd_link_hash_defweak
|| h->type == 2)))
&& olddyn
&& olddef
&& (h->elf_link_hash_flags & 010) != 0
&& (bind != 2
|| h->root.type == bfd_link_hash_defweak))
{
h->root.type = bfd_link_hash_undefined;
h->root.u.undef.abfd = h->root.u.def.section->owner;
*size_change_ok = true;
olddef = false;
olddyncommon = false;
if ((((sec)->flags & 0x8000) != 0))
*type_change_ok = true;
h->verinfo.vertree = ((void *)0);
*sym_hash = h;
}
if (! newdyn
&& (((sec)->flags & 0x8000) != 0)
&& olddyncommon)
{
if (! ((*info->callbacks->multiple_common)
(info, h->root.root.string, oldbfd, bfd_link_hash_common,
h->size, abfd, bfd_link_hash_common, sym->st_size)))
return false;
if (h->size > *pvalue)
*pvalue = h->size;
olddef = false;
olddyncommon = false;
h->root.type = bfd_link_hash_undefined;
h->root.u.undef.abfd = h->root.u.def.section->owner;
*size_change_ok = true;
*type_change_ok = true;
h->verinfo.vertree = ((void *)0);
}
if (olddef
&& ! dt_needed
&& h->root.type == bfd_link_hash_defweak
&& newdef
&& newdyn
&& bind != 2)
{
if ((h->elf_link_hash_flags & 02) != 0)
h->elf_link_hash_flags |= 01;
else if ((h->elf_link_hash_flags & 010) != 0)
h->elf_link_hash_flags |= 04;
h->elf_link_hash_flags &= ~ (02
| 010);
*sym_hash = h;
}
if (olddef
&& olddyn
&& h->root.type != bfd_link_hash_defweak
&& newdef
&& ! newdyn
&& bind == 2)
*override = true;
return true;
}
static boolean
elf_add_default_symbol (abfd, info, h, name, sym, sec, value,
dynsym, override, dt_needed)
bfd *abfd;
struct bfd_link_info *info;
struct elf_link_hash_entry *h;
const char *name;
Elf_Internal_Sym *sym;
asection **sec;
bfd_vma *value;
boolean *dynsym;
boolean override;
boolean dt_needed;
{
boolean type_change_ok;
boolean size_change_ok;
char *shortname;
struct elf_link_hash_entry *hi;
struct elf_backend_data *bed;
boolean collect;
boolean dynamic;
char *p;
p = (__extension__ (__builtin_constant_p ('@') && ('@') == '\0' ? (char *) __rawmemchr (name, '@') : strchr (name, '@')));
if (p == ((void *)0) || p[1] != '@')
return true;
if (override)
{
hi = ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (name), (true), (false), (false)));
{ if (!(hi != ((void *)0))) bfd_assert("elflink.h",1097); };
if (hi == h)
return true;
while (hi->root.type == bfd_link_hash_indirect
|| hi->root.type == bfd_link_hash_warning)
{
hi = (struct elf_link_hash_entry *) hi->root.u.i.link;
if (hi == h)
return true;
}
}
bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
collect = bed->collect;
dynamic = (abfd->flags & 0x40) != 0;
shortname = bfd_hash_allocate (&info->hash->table,
(size_t) (p - name + 1));
if (shortname == ((void *)0))
return false;
(__extension__ (__builtin_constant_p (name) && __builtin_constant_p ((size_t) (p - name)) ? (strlen (name) + 1 >= ((size_t) ((size_t) (p - name))) ? (char *) memcpy (shortname, name, (size_t) (p - name)) : strncpy (shortname, name, (size_t) (p - name))) : strncpy (shortname, name, (size_t) (p - name))));
shortname [p - name] = '\0';
type_change_ok = false;
size_change_ok = false;
if (! elf_merge_symbol (abfd, info, shortname, sym, sec, value,
&hi, &override, &type_change_ok,
&size_change_ok, dt_needed))
return false;
if (! override)
{
if (! (_bfd_generic_link_add_one_symbol
(info, abfd, shortname, 0x2000, ((asection *) &bfd_ind_section),
(bfd_vma) 0, name, false, collect,
(struct bfd_link_hash_entry **) &hi)))
return false;
}
else
{
# 1159 "elflink.h"
while (hi->root.type == bfd_link_hash_indirect
|| hi->root.type == bfd_link_hash_warning)
hi = (struct elf_link_hash_entry *) hi->root.u.i.link;
h->root.type = bfd_link_hash_indirect;
h->root.u.i.link = (struct bfd_link_hash_entry *) hi;
if (h->elf_link_hash_flags & 010)
{
h->elf_link_hash_flags &=~ 010;
hi->elf_link_hash_flags |= 04;
if (hi->elf_link_hash_flags
& (01
| 02))
{
if (! _bfd_elf_link_record_dynamic_symbol (info, hi))
return false;
}
}
hi = h;
}
if (hi->root.type == bfd_link_hash_indirect)
{
struct elf_link_hash_entry *ht;
{ if (!((hi->elf_link_hash_flags & (010 | 02)) == 0)) bfd_assert("elflink.h",1195); };
ht = (struct elf_link_hash_entry *) hi->root.u.i.link;
(*bed->elf_backend_copy_indirect_symbol) (ht, hi);
if (! *dynsym)
{
if (! dynamic)
{
if (info->shared
|| ((hi->elf_link_hash_flags
& 04) != 0))
*dynsym = true;
}
else
{
if ((hi->elf_link_hash_flags
& 01) != 0)
*dynsym = true;
}
}
}
shortname = bfd_hash_allocate (&info->hash->table, strlen (name));
if (shortname == ((void *)0))
return false;
(__extension__ (__builtin_constant_p (name) && __builtin_constant_p ((size_t) (p - name)) ? (strlen (name) + 1 >= ((size_t) ((size_t) (p - name))) ? (char *) memcpy (shortname, name, (size_t) (p - name)) : strncpy (shortname, name, (size_t) (p - name))) : strncpy (shortname, name, (size_t) (p - name))));
(__extension__ (__builtin_constant_p (p + 1) ? (((size_t)(const void *)((p + 1) + 1) - (size_t)(const void *)(p + 1) == 1) && strlen (p + 1) + 1 <= 8 ? __strcpy_small (shortname + (p - name), __extension__ ((__STRING2_COPY_ARR2) { { ((__const char *) (p + 1))[0], '\0' } }), __extension__ ((__STRING2_COPY_ARR3) { { ((__const char *) (p + 1))[0], ((__const char *) (p + 1))[1], '\0' } }), __extension__ ((__STRING2_COPY_ARR4) { { ((__const char *) (p + 1))[0], ((__const char *) (p + 1))[1], ((__const char *) (p + 1))[2], '\0' } }), __extension__ ((__STRING2_COPY_ARR5) { { ((__const char *) (p + 1))[0], ((__const char *) (p + 1))[1], ((__const char *) (p + 1))[2], ((__const char *) (p + 1))[3], '\0' } }), __extension__ ((__STRING2_COPY_ARR6) { { ((__const char *) (p + 1))[0], ((__const char *) (p + 1))[1], ((__const char *) (p + 1))[2], ((__const char *) (p + 1))[3], ((__const char *) (p + 1))[4], '\0' } }), __extension__ ((__STRING2_COPY_ARR7) { { ((__const char *) (p + 1))[0]!
, ((__const char *) (p + 1))[1], ((__const char *) (p + 1))[2], ((__const char *) (p + 1))[3], ((__const char *) (p + 1))[4], ((__const char *) (p + 1))[5], '\0' } }), __extension__ ((__STRING2_COPY_ARR8) { { ((__const char *) (p + 1))[0], ((__const char *) (p + 1))[1], ((__const char *) (p + 1))[2], ((__const char *) (p + 1))[3], ((__const char *) (p + 1))[4], ((__const char *) (p + 1))[5], ((__const char *) (p + 1))[6], '\0' } }), strlen (p + 1) + 1) : (char *) memcpy (shortname + (p - name), p + 1, strlen (p + 1) + 1)) : strcpy (shortname + (p - name), p + 1)));
type_change_ok = false;
size_change_ok = false;
if (! elf_merge_symbol (abfd, info, shortname, sym, sec, value,
&hi, &override, &type_change_ok,
&size_change_ok, dt_needed))
return false;
if (override)
{
(*_bfd_error_handler)
(dcgettext ("bfd", "%s: warning: unexpected redefinition of `%s'", __LC_MESSAGES),
bfd_archive_filename (abfd), shortname);
}
else
{
if (! (_bfd_generic_link_add_one_symbol
(info, abfd, shortname, 0x2000,
((asection *) &bfd_ind_section), (bfd_vma) 0, name, false,
collect, (struct bfd_link_hash_entry **) &hi)))
return false;
if (hi->root.type == bfd_link_hash_indirect)
{
{ if (!((hi->elf_link_hash_flags & (010 | 02)) == 0)) bfd_assert("elflink.h",1263); };
(*bed->elf_backend_copy_indirect_symbol) (h, hi);
if (! *dynsym)
{
if (! dynamic)
{
if (info->shared
|| ((hi->elf_link_hash_flags
& 04) != 0))
*dynsym = true;
}
else
{
if ((hi->elf_link_hash_flags
& 01) != 0)
*dynsym = true;
}
}
}
}
return true;
}
static boolean
elf_link_add_object_symbols (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
boolean (*add_symbol_hook) (bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, const char **, flagword *, asection **, bfd_vma *);
boolean (*check_relocs) (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
boolean collect;
Elf_Internal_Shdr *hdr;
bfd_size_type symcount;
bfd_size_type extsymcount;
bfd_size_type extsymoff;
Elf64_External_Sym *buf = ((void *)0);
struct elf_link_hash_entry **sym_hash;
boolean dynamic;
Elf_External_Versym *extversym = ((void *)0);
Elf_External_Versym *ever;
Elf64_External_Dyn *dynbuf = ((void *)0);
struct elf_link_hash_entry *weaks;
Elf64_External_Sym *esym;
Elf64_External_Sym *esymend;
struct elf_backend_data *bed;
boolean dt_needed;
struct elf_link_hash_table * hash_table;
file_ptr pos;
bfd_size_type amt;
hash_table = ((struct elf_link_hash_table *) ((info)->hash));
bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
add_symbol_hook = bed->elf_add_symbol_hook;
collect = bed->collect;
if ((abfd->flags & 0x40) == 0)
dynamic = false;
else
{
dynamic = true;
if (info->relocateable || info->hash->creator != abfd->xvec)
{
bfd_set_error (bfd_error_invalid_operation);
goto error_return;
}
}
if (! info->shared)
{
asection *s;
for (s = abfd->sections; s != ((void *)0); s = s->next)
{
const char *name;
name = ((s)->name + 0);
if ((__extension__ (__builtin_constant_p (sizeof ".gnu.warning." - 1) && ((__builtin_constant_p (name) && strlen (name) < ((size_t) (sizeof ".gnu.warning." - 1))) || (__builtin_constant_p (".gnu.warning.") && strlen (".gnu.warning.") < ((size_t) (sizeof ".gnu.warning." - 1)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (name) && __builtin_constant_p (".gnu.warning.") && (__s1_len = strlen (name), __s2_len = strlen (".gnu.warning."), (!((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((".gnu.warning.") + 1) - (size_t)(const void *)(".gnu.warning.") == 1) || __s2_len >= 4)) ? memcmp ((__const char *) (name), (__const char *) (".gnu.warning."), (__s1_len < __s2_len ? __s1_len : __s2_len) + 1) : (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) && (__s1_len = strlen (name), __s1_len < 4) ? (__builtin_constant_p (".gnu.war!
ning.") && ((size_t)(const void *)((".gnu.warning.") + 1) - (size_t)(const void *)(".gnu.warning.") == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (name))[0] - ((__const unsigned char *) (__const char *)(".gnu.warning."))[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[1] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[2] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (name))[3] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) (".gnu.warning."); register int __result = (((__const unsigned char *) (__const cha!
r *) (name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0!
) { __result = (((__const unsigned char *) (__const char *) (name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (name))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (".gnu.warning.") && ((size_t)(const void *)((".gnu.warning.") + 1) - (size_t)(const void *)(".gnu.warning.") == 1) && (__s2_len = strlen (".gnu.warning."), __s2_len < 4) ? (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (name))[0] - ((__const unsigned char *) (__const char *)(".gnu.warning."))[0]); if (__s2_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[1] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[1]); if (__s2_len!
> 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (name))[2] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[2]); if (__s2_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (name))[3] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (name); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) (".gnu.warning."))[3]); } } __result; }))) : strcmp (name, ".gnu.warning.")))); !
}) : strncmp (name, ".gnu.warning.", sizeof ".gnu.warning." -!
1))) == 0)
{
char *msg;
bfd_size_type sz;
name += sizeof ".gnu.warning." - 1;
# 1375 "elflink.h"
if (dynamic && abfd->xvec == info->hash->creator)
{
struct elf_link_hash_entry *h;
h = ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(hash_table)->root, (name), (false), (false), (true)));
if (h != ((void *)0)
&& (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak))
{
s->_raw_size = 0;
continue;
}
}
sz = (((s)->reloc_done ? (_bfd_abort ("elflink.h", 1395, __PRETTY_FUNCTION__), (bfd_size_type) 1) : (s)->_raw_size));
msg = (char *) bfd_alloc (abfd, sz + 1);
if (msg == ((void *)0))
goto error_return;
if (! bfd_get_section_contents (abfd, s, msg, (file_ptr) 0, sz))
goto error_return;
msg[sz] = '\0';
if (! (_bfd_generic_link_add_one_symbol
(info, abfd, name, 0x1000, s, (bfd_vma) 0, msg,
false, collect, (struct bfd_link_hash_entry **) ((void *)0))))
goto error_return;
if (! info->relocateable)
{
s->_raw_size = 0;
}
}
}
}
if (! dynamic || (((abfd) -> tdata.elf_obj_data) -> dynsymtab_section) == 0)
hdr = &((abfd) -> tdata.elf_obj_data)->symtab_hdr;
else
hdr = &((abfd) -> tdata.elf_obj_data)->dynsymtab_hdr;
if (dynamic)
{
if (! _bfd_elf_slurp_version_tables (abfd))
goto error_return;
if ((((abfd) -> tdata.elf_obj_data) -> dynversym_section) != 0)
{
Elf_Internal_Shdr *versymhdr;
versymhdr = &((abfd) -> tdata.elf_obj_data)->dynversym_hdr;
extversym = (Elf_External_Versym *) bfd_malloc (versymhdr->sh_size);
if (extversym == ((void *)0))
goto error_return;
amt = versymhdr->sh_size;
if (bfd_seek (abfd, versymhdr->sh_offset, 0) != 0
|| bfd_bread ((void *) extversym, amt, abfd) != amt)
goto error_return;
}
}
symcount = hdr->sh_size / sizeof (Elf64_External_Sym);
if ((((abfd) -> tdata.elf_obj_data) -> bad_symtab))
{
extsymcount = symcount;
extsymoff = 0;
}
else
{
extsymcount = symcount - hdr->sh_info;
extsymoff = hdr->sh_info;
}
amt = extsymcount * sizeof (Elf64_External_Sym);
buf = (Elf64_External_Sym *) bfd_malloc (amt);
if (buf == ((void *)0) && extsymcount != 0)
goto error_return;
amt = extsymcount * sizeof (struct elf_link_hash_entry *);
sym_hash = (struct elf_link_hash_entry **) bfd_alloc (abfd, amt);
if (sym_hash == ((void *)0))
goto error_return;
(((abfd) -> tdata.elf_obj_data) -> sym_hashes) = sym_hash;
dt_needed = false;
if (! dynamic)
{
if (info->shared
&& ((info)->hash->type == bfd_link_elf_hash_table)
&& ! hash_table->dynamic_sections_created
&& abfd->xvec == info->hash->creator)
{
if (! bfd_elf64_link_create_dynamic_sections (abfd, info))
goto error_return;
}
}
else if (! ((info)->hash->type == bfd_link_elf_hash_table))
goto error_return;
else
{
asection *s;
boolean add_needed;
const char *name;
bfd_size_type oldsize;
bfd_size_type strindex;
# 1518 "elflink.h"
add_needed = true;
name = ((char *) (abfd)->filename);
if ((((abfd) -> tdata.elf_obj_data) -> dt_name) != ((void *)0))
{
name = (((abfd) -> tdata.elf_obj_data) -> dt_name);
if (*name == '\0')
{
if ((((abfd) -> tdata.elf_obj_data) -> dt_soname) != ((void *)0))
dt_needed = true;
add_needed = false;
}
}
s = bfd_get_section_by_name (abfd, ".dynamic");
if (s != ((void *)0))
{
Elf64_External_Dyn *extdyn;
Elf64_External_Dyn *extdynend;
int elfsec;
unsigned long shlink;
int rpath;
int runpath;
dynbuf = (Elf64_External_Dyn *) bfd_malloc (s->_raw_size);
if (dynbuf == ((void *)0))
goto error_return;
if (! bfd_get_section_contents (abfd, s, (void *) dynbuf,
(file_ptr) 0, s->_raw_size))
goto error_return;
elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
if (elfsec == -1)
goto error_return;
shlink = (((abfd) -> tdata.elf_obj_data) -> elf_sect_ptr)[elfsec]->sh_link;
{
Elf_Internal_Shdr *shdr = (((abfd) -> tdata.elf_obj_data) -> elf_sect_ptr)[shlink];
if (shdr->sh_type != 3)
{
asection *ds = bfd_get_section_by_name (abfd, ".dynsym");
int elfdsec = _bfd_elf_section_from_bfd_section (abfd, ds);
if (elfdsec == -1)
goto error_return;
shlink = (((abfd) -> tdata.elf_obj_data) -> elf_sect_ptr)[elfdsec]->sh_link;
}
}
extdyn = dynbuf;
extdynend = extdyn + s->_raw_size / sizeof (Elf64_External_Dyn);
rpath = 0;
runpath = 0;
for (; extdyn < extdynend; extdyn++)
{
Elf_Internal_Dyn dyn;
bfd_elf64_swap_dyn_in (abfd, extdyn, &dyn);
if (dyn.d_tag == 14)
{
unsigned int tagv = dyn.d_un.d_val;
name = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
if (name == ((void *)0))
goto error_return;
}
if (dyn.d_tag == 1)
{
struct bfd_link_needed_list *n, **pn;
char *fnm, *anm;
unsigned int tagv = dyn.d_un.d_val;
amt = sizeof (struct bfd_link_needed_list);
n = (struct bfd_link_needed_list *) bfd_alloc (abfd, amt);
fnm = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
if (n == ((void *)0) || fnm == ((void *)0))
goto error_return;
anm = bfd_alloc (abfd, (bfd_size_type) strlen (fnm) + 1);
if (anm == ((void *)0))
goto error_return;
(__extension__ (__builtin_constant_p (fnm) ? (((size_t)(const void *)((fnm) + 1) - (size_t)(const void *)(fnm) == 1) && strlen (fnm) + 1 <= 8 ? __strcpy_small (anm, __extension__ ((__STRING2_COPY_ARR2) { { ((__const char *) (fnm))[0], '\0' } }), __extension__ ((__STRING2_COPY_ARR3) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], '\0' } }), __extension__ ((__STRING2_COPY_ARR4) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], '\0' } }), __extension__ ((__STRING2_COPY_ARR5) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], '\0' } }), __extension__ ((__STRING2_COPY_ARR6) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], '\0' } }), __extension__ ((__STRING2_COPY_ARR7) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const ch!
ar *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], ((__const char *) (fnm))[5], '\0' } }), __extension__ ((__STRING2_COPY_ARR8) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], ((__const char *) (fnm))[5], ((__const char *) (fnm))[6], '\0' } }), strlen (fnm) + 1) : (char *) memcpy (anm, fnm, strlen (fnm) + 1)) : strcpy (anm, fnm)));
n->name = anm;
n->by = abfd;
n->next = ((void *)0);
for (pn = & hash_table->needed;
*pn != ((void *)0);
pn = &(*pn)->next)
;
*pn = n;
}
if (dyn.d_tag == 29)
{
struct bfd_link_needed_list *n, **pn;
char *fnm, *anm;
unsigned int tagv = dyn.d_un.d_val;
if (rpath && hash_table->runpath)
hash_table->runpath = ((void *)0);
amt = sizeof (struct bfd_link_needed_list);
n = (struct bfd_link_needed_list *) bfd_alloc (abfd, amt);
fnm = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
if (n == ((void *)0) || fnm == ((void *)0))
goto error_return;
anm = bfd_alloc (abfd, (bfd_size_type) strlen (fnm) + 1);
if (anm == ((void *)0))
goto error_return;
(__extension__ (__builtin_constant_p (fnm) ? (((size_t)(const void *)((fnm) + 1) - (size_t)(const void *)(fnm) == 1) && strlen (fnm) + 1 <= 8 ? __strcpy_small (anm, __extension__ ((__STRING2_COPY_ARR2) { { ((__const char *) (fnm))[0], '\0' } }), __extension__ ((__STRING2_COPY_ARR3) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], '\0' } }), __extension__ ((__STRING2_COPY_ARR4) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], '\0' } }), __extension__ ((__STRING2_COPY_ARR5) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], '\0' } }), __extension__ ((__STRING2_COPY_ARR6) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], '\0' } }), __extension__ ((__STRING2_COPY_ARR7) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const ch!
ar *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], ((__const char *) (fnm))[5], '\0' } }), __extension__ ((__STRING2_COPY_ARR8) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], ((__const char *) (fnm))[5], ((__const char *) (fnm))[6], '\0' } }), strlen (fnm) + 1) : (char *) memcpy (anm, fnm, strlen (fnm) + 1)) : strcpy (anm, fnm)));
n->name = anm;
n->by = abfd;
n->next = ((void *)0);
for (pn = & hash_table->runpath;
*pn != ((void *)0);
pn = &(*pn)->next)
;
*pn = n;
runpath = 1;
rpath = 0;
}
if (!runpath && dyn.d_tag == 15)
{
struct bfd_link_needed_list *n, **pn;
char *fnm, *anm;
unsigned int tagv = dyn.d_un.d_val;
amt = sizeof (struct bfd_link_needed_list);
n = (struct bfd_link_needed_list *) bfd_alloc (abfd, amt);
fnm = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
if (n == ((void *)0) || fnm == ((void *)0))
goto error_return;
anm = bfd_alloc (abfd, (bfd_size_type) strlen (fnm) + 1);
if (anm == ((void *)0))
goto error_return;
(__extension__ (__builtin_constant_p (fnm) ? (((size_t)(const void *)((fnm) + 1) - (size_t)(const void *)(fnm) == 1) && strlen (fnm) + 1 <= 8 ? __strcpy_small (anm, __extension__ ((__STRING2_COPY_ARR2) { { ((__const char *) (fnm))[0], '\0' } }), __extension__ ((__STRING2_COPY_ARR3) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], '\0' } }), __extension__ ((__STRING2_COPY_ARR4) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], '\0' } }), __extension__ ((__STRING2_COPY_ARR5) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], '\0' } }), __extension__ ((__STRING2_COPY_ARR6) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], '\0' } }), __extension__ ((__STRING2_COPY_ARR7) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const ch!
ar *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], ((__const char *) (fnm))[5], '\0' } }), __extension__ ((__STRING2_COPY_ARR8) { { ((__const char *) (fnm))[0], ((__const char *) (fnm))[1], ((__const char *) (fnm))[2], ((__const char *) (fnm))[3], ((__const char *) (fnm))[4], ((__const char *) (fnm))[5], ((__const char *) (fnm))[6], '\0' } }), strlen (fnm) + 1) : (char *) memcpy (anm, fnm, strlen (fnm) + 1)) : strcpy (anm, fnm)));
n->name = anm;
n->by = abfd;
n->next = ((void *)0);
for (pn = & hash_table->runpath;
*pn != ((void *)0);
pn = &(*pn)->next)
;
*pn = n;
rpath = 1;
}
}
free (dynbuf);
dynbuf = ((void *)0);
}
# 1683 "elflink.h"
abfd->sections = ((void *)0);
abfd->section_count = 0;
if (! hash_table->dynamic_sections_created)
if (! bfd_elf64_link_create_dynamic_sections (abfd, info))
goto error_return;
if (add_needed)
{
oldsize = _bfd_elf_strtab_size (hash_table->dynstr);
strindex = _bfd_elf_strtab_add (hash_table->dynstr, name, false);
if (strindex == (bfd_size_type) -1)
goto error_return;
if (oldsize == _bfd_elf_strtab_size (hash_table->dynstr))
{
asection *sdyn;
Elf64_External_Dyn *dyncon, *dynconend;
sdyn = bfd_get_section_by_name (hash_table->dynobj, ".dynamic");
{ if (!(sdyn != ((void *)0))) bfd_assert("elflink.h",1711); };
dyncon = (Elf64_External_Dyn *) sdyn->contents;
dynconend = (Elf64_External_Dyn *) (sdyn->contents +
sdyn->_raw_size);
for (; dyncon < dynconend; dyncon++)
{
Elf_Internal_Dyn dyn;
bfd_elf64_swap_dyn_in (hash_table->dynobj, dyncon, & dyn);
if (dyn.d_tag == 1
&& dyn.d_un.d_val == strindex)
{
if (buf != ((void *)0))
free (buf);
if (extversym != ((void *)0))
free (extversym);
_bfd_elf_strtab_delref (hash_table->dynstr, strindex);
return true;
}
}
}
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 1, strindex))
goto error_return;
}
if (*name == '\0')
name = basename (((char *) (abfd)->filename));
(((abfd) -> tdata.elf_obj_data) -> dt_name) = name;
}
pos = hdr->sh_offset + extsymoff * sizeof (Elf64_External_Sym);
amt = extsymcount * sizeof (Elf64_External_Sym);
if (bfd_seek (abfd, pos, 0) != 0
|| bfd_bread ((void *) buf, amt, abfd) != amt)
goto error_return;
weaks = ((void *)0);
ever = extversym != ((void *)0) ? extversym + extsymoff : ((void *)0);
esymend = buf + extsymcount;
for (esym = buf;
esym < esymend;
esym++, sym_hash++, ever = (ever != ((void *)0) ? ever + 1 : ((void *)0)))
{
Elf_Internal_Sym sym;
int bind;
bfd_vma value;
asection *sec;
flagword flags;
const char *name;
struct elf_link_hash_entry *h;
boolean definition;
boolean size_change_ok, type_change_ok;
boolean new_weakdef;
unsigned int old_alignment;
boolean override;
override = false;
bfd_elf64_swap_symbol_in (abfd, esym, &sym);
flags = 0x00;
sec = ((void *)0);
value = sym.st_value;
*sym_hash = ((void *)0);
bind = (((unsigned int)(sym.st_info)) >> 4);
if (bind == 0)
{
continue;
}
else if (bind == 1)
{
if (sym.st_shndx != 0
&& sym.st_shndx != 0xFFF2)
flags = 0x02;
}
else if (bind == 2)
flags = 0x80;
else
{
}
if (sym.st_shndx == 0)
sec = ((asection *) &bfd_und_section);
else if (sym.st_shndx > 0 && sym.st_shndx < 0xFF00)
{
sec = bfd_section_from_elf_index (abfd, sym.st_shndx);
if (sec == ((void *)0))
sec = ((asection *) &bfd_abs_section);
else if ((abfd->flags & (0x02 | 0x40)) != 0)
value -= sec->vma;
}
else if (sym.st_shndx == 0xFFF1)
sec = ((asection *) &bfd_abs_section);
else if (sym.st_shndx == 0xFFF2)
{
sec = ((asection *) &bfd_com_section);
value = sym.st_size;
}
else
{
}
name = bfd_elf_string_from_elf_section (abfd, hdr->sh_link, sym.st_name);
if (name == (const char *) ((void *)0))
goto error_return;
if (add_symbol_hook)
{
if (! (*add_symbol_hook) (abfd, info, &sym, &name, &flags, &sec,
&value))
goto error_return;
if (name == (const char *) ((void *)0))
continue;
}
if (sec == (asection *) ((void *)0))
{
bfd_set_error (bfd_error_bad_value);
goto error_return;
}
if (((sec) == ((asection *) &bfd_und_section))
|| (((sec)->flags & 0x8000) != 0))
definition = false;
else
definition = true;
size_change_ok = false;
type_change_ok = ((struct elf_backend_data *) (abfd)->xvec->backend_data)->type_change_ok;
old_alignment = 0;
if (info->hash->creator->flavour == bfd_target_elf_flavour)
{
Elf_Internal_Versym iver;
unsigned int vernum = 0;
if (ever != ((void *)0))
{
_bfd_elf_swap_versym_in (abfd, ever, &iver);
vernum = iver.vs_vers & 0x7fff;
if ((iver.vs_vers & 0x8000) != 0
|| (vernum > 1 && ! ((sec) == ((asection *) &bfd_abs_section))))
{
const char *verstr;
unsigned int namelen;
bfd_size_type newlen;
char *newname, *p;
if (sym.st_shndx != 0)
{
if (vernum > ((abfd) -> tdata.elf_obj_data)->dynverdef_hdr.sh_info)
{
(*_bfd_error_handler)
(dcgettext ("bfd", "%s: %s: invalid version %u (max %d)", __LC_MESSAGES),
bfd_archive_filename (abfd), name, vernum,
((abfd) -> tdata.elf_obj_data)->dynverdef_hdr.sh_info);
bfd_set_error (bfd_error_bad_value);
goto error_return;
}
else if (vernum > 1)
verstr =
((abfd) -> tdata.elf_obj_data)->verdef[vernum - 1].vd_nodename;
else
verstr = "";
}
else
{
Elf_Internal_Verneed *t;
verstr = ((void *)0);
for (t = ((abfd) -> tdata.elf_obj_data)->verref;
t != ((void *)0);
t = t->vn_nextref)
{
Elf_Internal_Vernaux *a;
for (a = t->vn_auxptr; a != ((void *)0); a = a->vna_nextptr)
{
if (a->vna_other == vernum)
{
verstr = a->vna_nodename;
break;
}
}
if (a != ((void *)0))
break;
}
if (verstr == ((void *)0))
{
(*_bfd_error_handler)
(dcgettext ("bfd", "%s: %s: invalid needed version %d", __LC_MESSAGES),
bfd_archive_filename (abfd), name, vernum);
bfd_set_error (bfd_error_bad_value);
goto error_return;
}
}
namelen = strlen (name);
newlen = namelen + strlen (verstr) + 2;
if ((iver.vs_vers & 0x8000) == 0)
++newlen;
newname = (char *) bfd_alloc (abfd, newlen);
if (newname == ((void *)0))
goto error_return;
(__extension__ (__builtin_constant_p (name) ? (((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) && strlen (name) + 1 <= 8 ? __strcpy_small (newname, __extension__ ((__STRING2_COPY_ARR2) { { ((__const char *) (name))[0], '\0' } }), __extension__ ((__STRING2_COPY_ARR3) { { ((__const char *) (name))[0], ((__const char *) (name))[1], '\0' } }), __extension__ ((__STRING2_COPY_ARR4) { { ((__const char *) (name))[0], ((__const char *) (name))[1], ((__const char *) (name))[2], '\0' } }), __extension__ ((__STRING2_COPY_ARR5) { { ((__const char *) (name))[0], ((__const char *) (name))[1], ((__const char *) (name))[2], ((__const char *) (name))[3], '\0' } }), __extension__ ((__STRING2_COPY_ARR6) { { ((__const char *) (name))[0], ((__const char *) (name))[1], ((__const char *) (name))[2], ((__const char *) (name))[3], ((__const char *) (name))[4], '\0' } }), __extension__ ((__STRING2_COPY_ARR7) { { ((__const char *) (name))[0], ((__const char *)!
(name))[1], ((__const char *) (name))[2], ((__const char *) (name))[3], ((__const char *) (name))[4], ((__const char *) (name))[5], '\0' } }), __extension__ ((__STRING2_COPY_ARR8) { { ((__const char *) (name))[0], ((__const char *) (name))[1], ((__const char *) (name))[2], ((__const char *) (name))[3], ((__const char *) (name))[4], ((__const char *) (name))[5], ((__const char *) (name))[6], '\0' } }), strlen (name) + 1) : (char *) memcpy (newname, name, strlen (name) + 1)) : strcpy (newname, name)));
p = newname + namelen;
*p++ = '@';
if ((iver.vs_vers & 0x8000) == 0
&& sym.st_shndx != 0)
*p++ = '@';
(__extension__ (__builtin_constant_p (verstr) ? (((size_t)(const void *)((verstr) + 1) - (size_t)(const void *)(verstr) == 1) && strlen (verstr) + 1 <= 8 ? __strcpy_small (p, __extension__ ((__STRING2_COPY_ARR2) { { ((__const char *) (verstr))[0], '\0' } }), __extension__ ((__STRING2_COPY_ARR3) { { ((__const char *) (verstr))[0], ((__const char *) (verstr))[1], '\0' } }), __extension__ ((__STRING2_COPY_ARR4) { { ((__const char *) (verstr))[0], ((__const char *) (verstr))[1], ((__const char *) (verstr))[2], '\0' } }), __extension__ ((__STRING2_COPY_ARR5) { { ((__const char *) (verstr))[0], ((__const char *) (verstr))[1], ((__const char *) (verstr))[2], ((__const char *) (verstr))[3], '\0' } }), __extension__ ((__STRING2_COPY_ARR6) { { ((__const char *) (verstr))[0], ((__const char *) (verstr))[1], ((__const char *) (verstr))[2], ((__const char *) (verstr))[3], ((__const char *) (verstr))[4], '\0' } }), __extension__ ((__STRING2_COPY_ARR7) { { ((__const char !
*) (verstr))[0], ((__const char *) (verstr))[1], ((__const char *) (verstr))[2], ((__const char *) (verstr))[3], ((__const char *) (verstr))[4], ((__const char *) (verstr))[5], '\0' } }), __extension__ ((__STRING2_COPY_ARR8) { { ((__const char *) (verstr))[0], ((__const char *) (verstr))[1], ((__const char *) (verstr))[2], ((__const char *) (verstr))[3], ((__const char *) (verstr))[4], ((__const char *) (verstr))[5], ((__const char *) (verstr))[6], '\0' } }), strlen (verstr) + 1) : (char *) memcpy (p, verstr, strlen (verstr) + 1)) : strcpy (p, verstr)));
name = newname;
}
}
if (! elf_merge_symbol (abfd, info, name, &sym, &sec, &value,
sym_hash, &override, &type_change_ok,
&size_change_ok, dt_needed))
goto error_return;
if (override)
definition = false;
h = *sym_hash;
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;
if (h->root.type == bfd_link_hash_common)
old_alignment = h->root.u.c.p->alignment_power;
if (((abfd) -> tdata.elf_obj_data)->verdef != ((void *)0)
&& ! override
&& vernum > 1
&& definition)
h->verinfo.verdef = &((abfd) -> tdata.elf_obj_data)->verdef[vernum - 1];
}
if (! (_bfd_generic_link_add_one_symbol
(info, abfd, name, flags, sec, value, (const char *) ((void *)0),
false, collect, (struct bfd_link_hash_entry **) sym_hash)))
goto error_return;
h = *sym_hash;
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;
*sym_hash = h;
new_weakdef = false;
if (dynamic
&& definition
&& (flags & 0x80) != 0
&& ((sym.st_info) & 0xF) != 2
&& info->hash->creator->flavour == bfd_target_elf_flavour
&& h->weakdef == ((void *)0))
{
# 2017 "elflink.h"
h->weakdef = weaks;
weaks = h;
new_weakdef = true;
}
if (sym.st_shndx == 0xFFF2
&& h->root.type == bfd_link_hash_common)
{
unsigned int align;
align = bfd_log2 (sym.st_value);
if (align > old_alignment
|| (sym.st_value == 1 && old_alignment == 0))
h->root.u.c.p->alignment_power = align;
}
if (info->hash->creator->flavour == bfd_target_elf_flavour)
{
int old_flags;
boolean dynsym;
int new_flag;
if (sym.st_size != 0
&& (definition || h->size == 0))
{
if (h->size != 0 && h->size != sym.st_size && ! size_change_ok)
(*_bfd_error_handler)
(dcgettext ("bfd", "Warning: size of symbol `%s' changed from %lu to %lu in %s", __LC_MESSAGES),
name, (unsigned long) h->size, (unsigned long) sym.st_size,
bfd_archive_filename (abfd));
h->size = sym.st_size;
}
if (h->root.type == bfd_link_hash_common)
h->size = h->root.u.c.size;
if (((sym.st_info) & 0xF) != 0
&& (definition || h->type == 0))
{
if (h->type != 0
&& h->type != ((sym.st_info) & 0xF)
&& ! type_change_ok)
(*_bfd_error_handler)
(dcgettext ("bfd", "Warning: type of symbol `%s' changed from %d to %d in %s", __LC_MESSAGES),
name, h->type, ((sym.st_info) & 0xF),
bfd_archive_filename (abfd));
h->type = ((sym.st_info) & 0xF);
}
if (sym.st_other != 0)
{
unsigned char hvis = ((h->other) & 0x3);
unsigned char symvis = ((sym.st_other) & 0x3);
if (symvis && (hvis > symvis || hvis == 0))
h->other = sym.st_other;
if (!symvis && !hvis
&& (definition || h->other == 0))
h->other = sym.st_other;
}
old_flags = h->elf_link_hash_flags;
dynsym = false;
if (! dynamic)
{
if (! definition)
{
new_flag = 01;
if (bind != 2)
new_flag |= 020;
}
else
new_flag = 02;
if (info->shared
|| (old_flags & (010
| 04)) != 0)
dynsym = true;
}
else
{
if (! definition)
new_flag = 04;
else
new_flag = 010;
if ((old_flags & (02
| 01)) != 0
|| (h->weakdef != ((void *)0)
&& ! new_weakdef
&& h->weakdef->dynindx != -1))
dynsym = true;
}
h->elf_link_hash_flags |= new_flag;
if (definition || h->root.type == bfd_link_hash_common)
if (! elf_add_default_symbol (abfd, info, h, name, &sym,
&sec, &value, &dynsym,
override, dt_needed))
goto error_return;
if (dynsym && h->dynindx == -1)
{
if (! _bfd_elf_link_record_dynamic_symbol (info, h))
goto error_return;
if (h->weakdef != ((void *)0)
&& ! new_weakdef
&& h->weakdef->dynindx == -1)
{
if (! _bfd_elf_link_record_dynamic_symbol (info, h->weakdef))
goto error_return;
}
}
else if (dynsym && h->dynindx != -1)
switch (((h->other) & 0x3))
{
case 1:
case 2:
h->elf_link_hash_flags |= 02000;
(*bed->elf_backend_hide_symbol) (info, h);
_bfd_elf_strtab_delref (hash_table->dynstr,
h->dynstr_index);
break;
}
if (dt_needed && definition
&& (h->elf_link_hash_flags
& 01) != 0)
{
bfd_size_type oldsize;
bfd_size_type strindex;
if (! ((info)->hash->type == bfd_link_elf_hash_table))
goto error_return;
dt_needed = false;
oldsize = _bfd_elf_strtab_size (hash_table->dynstr);
strindex = _bfd_elf_strtab_add (hash_table->dynstr,
(((abfd) -> tdata.elf_obj_data) -> dt_soname), false);
if (strindex == (bfd_size_type) -1)
goto error_return;
if (oldsize == _bfd_elf_strtab_size (hash_table->dynstr))
{
asection *sdyn;
Elf64_External_Dyn *dyncon, *dynconend;
sdyn = bfd_get_section_by_name (hash_table->dynobj,
".dynamic");
{ if (!(sdyn != ((void *)0))) bfd_assert("elflink.h",2197); };
dyncon = (Elf64_External_Dyn *) sdyn->contents;
dynconend = (Elf64_External_Dyn *) (sdyn->contents +
sdyn->_raw_size);
for (; dyncon < dynconend; dyncon++)
{
Elf_Internal_Dyn dyn;
bfd_elf64_swap_dyn_in (hash_table->dynobj,
dyncon, &dyn);
{ if (!(dyn.d_tag != 1 || dyn.d_un.d_val != strindex)) bfd_assert("elflink.h",2209); };
}
}
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 1, strindex))
goto error_return;
}
}
}
# 2232 "elflink.h"
while (weaks != ((void *)0))
{
struct elf_link_hash_entry *hlook;
asection *slook;
bfd_vma vlook;
struct elf_link_hash_entry **hpp;
struct elf_link_hash_entry **hppend;
hlook = weaks;
weaks = hlook->weakdef;
hlook->weakdef = ((void *)0);
{ if (!(hlook->root.type == bfd_link_hash_defined || hlook->root.type == bfd_link_hash_defweak || hlook->root.type == bfd_link_hash_common || hlook->root.type == bfd_link_hash_indirect)) bfd_assert("elflink.h",2247); };
slook = hlook->root.u.def.section;
vlook = hlook->root.u.def.value;
hpp = (((abfd) -> tdata.elf_obj_data) -> sym_hashes);
hppend = hpp + extsymcount;
for (; hpp < hppend; hpp++)
{
struct elf_link_hash_entry *h;
h = *hpp;
if (h != ((void *)0) && h != hlook
&& h->root.type == bfd_link_hash_defined
&& h->root.u.def.section == slook
&& h->root.u.def.value == vlook)
{
hlook->weakdef = h;
if (hlook->dynindx != -1
&& h->dynindx == -1)
{
if (! _bfd_elf_link_record_dynamic_symbol (info, h))
goto error_return;
}
if (h->dynindx != -1
&& hlook->dynindx == -1)
{
if (! _bfd_elf_link_record_dynamic_symbol (info, hlook))
goto error_return;
}
break;
}
}
}
if (buf != ((void *)0))
{
free (buf);
buf = ((void *)0);
}
if (extversym != ((void *)0))
{
free (extversym);
extversym = ((void *)0);
}
# 2321 "elflink.h"
check_relocs = ((struct elf_backend_data *) (abfd)->xvec->backend_data)->check_relocs;
if (! dynamic
&& abfd->xvec == info->hash->creator
&& check_relocs != ((void *)0))
{
asection *o;
for (o = abfd->sections; o != ((void *)0); o = o->next)
{
Elf_Internal_Rela *internal_relocs;
boolean ok;
if ((o->flags & 0x004) == 0
|| o->reloc_count == 0
|| ((info->strip == strip_all || info->strip == strip_debugger)
&& (o->flags & 0x10000) != 0)
|| ((o->output_section) == ((asection *) &bfd_abs_section)))
continue;
internal_relocs = (_bfd_elf64_link_read_relocs
(abfd, o, (void *) ((void *)0),
(Elf_Internal_Rela *) ((void *)0),
info->keep_memory));
if (internal_relocs == ((void *)0))
goto error_return;
ok = (*check_relocs) (abfd, info, o, internal_relocs);
if (! info->keep_memory)
free (internal_relocs);
if (! ok)
goto error_return;
}
}
if (! dynamic
&& ! info->relocateable
&& ! info->traditional_format
&& info->hash->creator->flavour == bfd_target_elf_flavour
&& ((info)->hash->type == bfd_link_elf_hash_table)
&& (info->strip != strip_all && info->strip != strip_debugger))
{
asection *stab, *stabstr;
stab = bfd_get_section_by_name (abfd, ".stab");
if (stab != ((void *)0))
{
stabstr = bfd_get_section_by_name (abfd, ".stabstr");
if (stabstr != ((void *)0))
{
struct bfd_elf_section_data *secdata;
secdata = ((struct bfd_elf_section_data*)stab->used_by_bfd);
if (! _bfd_link_section_stabs (abfd,
& hash_table->stab_info,
stab, stabstr,
&secdata->stab_info))
goto error_return;
}
}
}
if (! info->relocateable && ! dynamic
&& ((info)->hash->type == bfd_link_elf_hash_table))
{
asection *s;
for (s = abfd->sections; s != ((void *)0); s = s->next)
if ((s->flags & 0x20000000)
&& ! _bfd_merge_section (abfd, & hash_table->merge_info, s,
& ((struct bfd_elf_section_data*)s->used_by_bfd)->merge_info))
goto error_return;
}
if (((info)->hash->type == bfd_link_elf_hash_table))
{
struct elf_link_loaded_list *n, **pn;
n = (struct elf_link_loaded_list *)
bfd_alloc (abfd, sizeof (struct elf_link_loaded_list));
if (n == ((void *)0))
goto error_return;
n->next = ((void *)0);
n->abfd = abfd;
for (pn = &hash_table->loaded; *pn != ((void *)0); pn = &(*pn)->next)
;
*pn = n;
}
return true;
error_return:
if (buf != ((void *)0))
free (buf);
if (dynbuf != ((void *)0))
free (dynbuf);
if (extversym != ((void *)0))
free (extversym);
return false;
}
# 2434 "elflink.h"
boolean
bfd_elf64_link_create_dynamic_sections (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
flagword flags;
register asection *s;
struct elf_link_hash_entry *h;
struct elf_backend_data *bed;
if (! ((info)->hash->type == bfd_link_elf_hash_table))
return false;
if (((struct elf_link_hash_table *) ((info)->hash))->dynamic_sections_created)
return true;
if (((struct elf_link_hash_table *) ((info)->hash))->dynobj == ((void *)0))
((struct elf_link_hash_table *) ((info)->hash))->dynobj = abfd;
else
abfd = ((struct elf_link_hash_table *) ((info)->hash))->dynobj;
flags = (0x001 | 0x002 | 0x200
| 0x20000 | 0x800000);
if (! info->shared)
{
s = bfd_make_section (abfd, ".interp");
if (s == ((void *)0)
|| ! bfd_set_section_flags (abfd, s, flags | 0x010))
return false;
}
s = bfd_make_section (abfd, ".gnu.version_d");
if (s == ((void *)0)
|| ! bfd_set_section_flags (abfd, s, flags | 0x010)
|| ! (((s)->alignment_power = (3)),true))
return false;
s = bfd_make_section (abfd, ".gnu.version");
if (s == ((void *)0)
|| ! bfd_set_section_flags (abfd, s, flags | 0x010)
|| ! (((s)->alignment_power = (1)),true))
return false;
s = bfd_make_section (abfd, ".gnu.version_r");
if (s == ((void *)0)
|| ! bfd_set_section_flags (abfd, s, flags | 0x010)
|| ! (((s)->alignment_power = (3)),true))
return false;
s = bfd_make_section (abfd, ".dynsym");
if (s == ((void *)0)
|| ! bfd_set_section_flags (abfd, s, flags | 0x010)
|| ! (((s)->alignment_power = (3)),true))
return false;
s = bfd_make_section (abfd, ".dynstr");
if (s == ((void *)0)
|| ! bfd_set_section_flags (abfd, s, flags | 0x010))
return false;
if (((struct elf_link_hash_table *) ((info)->hash))->dynstr == ((void *)0))
{
((struct elf_link_hash_table *) ((info)->hash))->dynstr = _bfd_elf_strtab_init ();
if (((struct elf_link_hash_table *) ((info)->hash))->dynstr == ((void *)0))
return false;
}
s = bfd_make_section (abfd, ".dynamic");
if (s == ((void *)0)
|| ! bfd_set_section_flags (abfd, s, flags)
|| ! (((s)->alignment_power = (3)),true))
return false;
# 2524 "elflink.h"
h = ((void *)0);
if (! (_bfd_generic_link_add_one_symbol
(info, abfd, "_DYNAMIC", 0x02, s, (bfd_vma) 0,
(const char *) ((void *)0), false, ((struct elf_backend_data *) (abfd)->xvec->backend_data)->collect,
(struct bfd_link_hash_entry **) &h)))
return false;
h->elf_link_hash_flags |= 02;
h->type = 1;
if (info->shared
&& ! _bfd_elf_link_record_dynamic_symbol (info, h))
return false;
bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
s = bfd_make_section (abfd, ".hash");
if (s == ((void *)0)
|| ! bfd_set_section_flags (abfd, s, flags | 0x010)
|| ! (((s)->alignment_power = (3)),true))
return false;
((struct bfd_elf_section_data*)s->used_by_bfd)->this_hdr.sh_entsize = bed->s->sizeof_hash_entry;
if (! (*bed->elf_backend_create_dynamic_sections) (abfd, info))
return false;
((struct elf_link_hash_table *) ((info)->hash))->dynamic_sections_created = true;
return true;
}
boolean
bfd_elf64_add_dynamic_entry (info, tag, val)
struct bfd_link_info *info;
bfd_vma tag;
bfd_vma val;
{
Elf_Internal_Dyn dyn;
bfd *dynobj;
asection *s;
bfd_size_type newsize;
bfd_byte *newcontents;
if (! ((info)->hash->type == bfd_link_elf_hash_table))
return false;
dynobj = ((struct elf_link_hash_table *) ((info)->hash))->dynobj;
s = bfd_get_section_by_name (dynobj, ".dynamic");
{ if (!(s != ((void *)0))) bfd_assert("elflink.h",2577); };
newsize = s->_raw_size + sizeof (Elf64_External_Dyn);
newcontents = (bfd_byte *) bfd_realloc (s->contents, newsize);
if (newcontents == ((void *)0))
return false;
dyn.d_tag = tag;
dyn.d_un.d_val = val;
bfd_elf64_swap_dyn_out (dynobj, &dyn,
(Elf64_External_Dyn *) (newcontents + s->_raw_size));
s->_raw_size = newsize;
s->contents = newcontents;
return true;
}
boolean
_bfd_elf64_link_record_local_dynamic_symbol (info, input_bfd, input_indx)
struct bfd_link_info *info;
bfd *input_bfd;
long input_indx;
{
struct elf_link_local_dynamic_entry *entry;
struct elf_link_hash_table *eht;
struct elf_strtab_hash *dynstr;
Elf64_External_Sym esym;
unsigned long dynstr_index;
char *name;
file_ptr pos;
bfd_size_type amt;
if (! ((info)->hash->type == bfd_link_elf_hash_table))
return false;
for (entry = ((struct elf_link_hash_table *) ((info)->hash))->dynlocal; entry ; entry = entry->next)
if (entry->input_bfd == input_bfd && entry->input_indx == input_indx)
return true;
entry = (struct elf_link_local_dynamic_entry *)
bfd_alloc (input_bfd, (bfd_size_type) sizeof (*entry));
if (entry == ((void *)0))
return false;
amt = sizeof (Elf64_External_Sym);
pos = ((input_bfd) -> tdata.elf_obj_data)->symtab_hdr.sh_offset + input_indx * amt;
if (bfd_seek (input_bfd, pos, 0) != 0
|| bfd_bread (&esym, amt, input_bfd) != amt)
return false;
bfd_elf64_swap_symbol_in (input_bfd, &esym, &entry->isym);
name = (bfd_elf_string_from_elf_section
(input_bfd, ((input_bfd) -> tdata.elf_obj_data)->symtab_hdr.sh_link,
entry->isym.st_name));
dynstr = ((struct elf_link_hash_table *) ((info)->hash))->dynstr;
if (dynstr == ((void *)0))
{
((struct elf_link_hash_table *) ((info)->hash))->dynstr = dynstr = _bfd_elf_strtab_init ();
if (dynstr == ((void *)0))
return false;
}
dynstr_index = _bfd_elf_strtab_add (dynstr, name, false);
if (dynstr_index == (unsigned long) -1)
return false;
entry->isym.st_name = dynstr_index;
eht = ((struct elf_link_hash_table *) ((info)->hash));
entry->next = eht->dynlocal;
eht->dynlocal = entry;
entry->input_bfd = input_bfd;
entry->input_indx = input_indx;
eht->dynsymcount++;
entry->isym.st_info
= (((0) << 4) + ((((entry->isym.st_info) & 0xF)) & 0xF));
return true;
}
# 2677 "elflink.h"
static boolean
elf_link_read_relocs_from_section (abfd, shdr, external_relocs,
internal_relocs)
bfd *abfd;
Elf_Internal_Shdr *shdr;
void * external_relocs;
Elf_Internal_Rela *internal_relocs;
{
struct elf_backend_data *bed;
bfd_size_type amt;
if (!shdr)
return true;
if (bfd_seek (abfd, shdr->sh_offset, 0) != 0)
return false;
if (bfd_bread (external_relocs, shdr->sh_size, abfd) != shdr->sh_size)
return false;
bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
if (shdr->sh_entsize == sizeof (Elf64_External_Rel))
{
Elf64_External_Rel *erel;
Elf64_External_Rel *erelend;
Elf_Internal_Rela *irela;
Elf_Internal_Rel *irel;
erel = (Elf64_External_Rel *) external_relocs;
erelend = erel + ((shdr)->sh_size / (shdr)->sh_entsize);
irela = internal_relocs;
amt = bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rel);
irel = bfd_alloc (abfd, amt);
for (; erel < erelend; erel++, irela += bed->s->int_rels_per_ext_rel)
{
unsigned int i;
if (bed->s->swap_reloc_in)
(*bed->s->swap_reloc_in) (abfd, (bfd_byte *) erel, irel);
else
bfd_elf64_swap_reloc_in (abfd, erel, irel);
for (i = 0; i < bed->s->int_rels_per_ext_rel; ++i)
{
irela[i].r_offset = irel[i].r_offset;
irela[i].r_info = irel[i].r_info;
irela[i].r_addend = 0;
}
}
}
else
{
Elf64_External_Rela *erela;
Elf64_External_Rela *erelaend;
Elf_Internal_Rela *irela;
{ if (!(shdr->sh_entsize == sizeof (Elf64_External_Rela))) bfd_assert("elflink.h",2738); };
erela = (Elf64_External_Rela *) external_relocs;
erelaend = erela + ((shdr)->sh_size / (shdr)->sh_entsize);
irela = internal_relocs;
for (; erela < erelaend; erela++, irela += bed->s->int_rels_per_ext_rel)
{
if (bed->s->swap_reloca_in)
(*bed->s->swap_reloca_in) (abfd, (bfd_byte *) erela, irela);
else
bfd_elf64_swap_reloca_in (abfd, erela, irela);
}
}
return true;
}
# 2765 "elflink.h"
Elf_Internal_Rela *
_bfd_elf64_link_read_relocs (abfd, o, external_relocs, internal_relocs,
keep_memory)
bfd *abfd;
asection *o;
void * external_relocs;
Elf_Internal_Rela *internal_relocs;
boolean keep_memory;
{
Elf_Internal_Shdr *rel_hdr;
void * alloc1 = ((void *)0);
Elf_Internal_Rela *alloc2 = ((void *)0);
struct elf_backend_data *bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
if (((struct bfd_elf_section_data*)o->used_by_bfd)->relocs != ((void *)0))
return ((struct bfd_elf_section_data*)o->used_by_bfd)->relocs;
if (o->reloc_count == 0)
return ((void *)0);
rel_hdr = &((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr;
if (internal_relocs == ((void *)0))
{
bfd_size_type size;
size = o->reloc_count;
size *= bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela);
if (keep_memory)
internal_relocs = (Elf_Internal_Rela *) bfd_alloc (abfd, size);
else
internal_relocs = alloc2 = (Elf_Internal_Rela *) bfd_malloc (size);
if (internal_relocs == ((void *)0))
goto error_return;
}
if (external_relocs == ((void *)0))
{
bfd_size_type size = rel_hdr->sh_size;
if (((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr2)
size += ((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr2->sh_size;
alloc1 = (void *) bfd_malloc (size);
if (alloc1 == ((void *)0))
goto error_return;
external_relocs = alloc1;
}
if (!elf_link_read_relocs_from_section (abfd, rel_hdr,
external_relocs,
internal_relocs))
goto error_return;
if (!elf_link_read_relocs_from_section
(abfd,
((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr2,
((bfd_byte *) external_relocs) + rel_hdr->sh_size,
internal_relocs + (((rel_hdr)->sh_size / (rel_hdr)->sh_entsize)
* bed->s->int_rels_per_ext_rel)))
goto error_return;
if (keep_memory)
((struct bfd_elf_section_data*)o->used_by_bfd)->relocs = internal_relocs;
if (alloc1 != ((void *)0))
free (alloc1);
return internal_relocs;
error_return:
if (alloc1 != ((void *)0))
free (alloc1);
if (alloc2 != ((void *)0))
free (alloc2);
return ((void *)0);
}
boolean
bfd_elf64_record_link_assignment (output_bfd, info, name, provide)
bfd *output_bfd __attribute__ ((__unused__));
struct bfd_link_info *info;
const char *name;
boolean provide;
{
struct elf_link_hash_entry *h;
if (info->hash->creator->flavour != bfd_target_elf_flavour)
return true;
h = ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (name), (true), (true), (false)));
if (h == ((void *)0))
return false;
if (h->root.type == bfd_link_hash_new)
h->elf_link_hash_flags &= ~0400;
if (provide
&& (h->elf_link_hash_flags & 010) != 0
&& (h->elf_link_hash_flags & 02) == 0)
h->root.type = bfd_link_hash_undefined;
if (!provide
&& (h->elf_link_hash_flags & 010) != 0
&& (h->elf_link_hash_flags & 02) == 0)
h->verinfo.verdef = ((void *)0);
h->elf_link_hash_flags |= 02;
if (h->type == 0)
h->type = 1;
if (((h->elf_link_hash_flags & (010
| 04)) != 0
|| info->shared)
&& h->dynindx == -1)
{
if (! _bfd_elf_link_record_dynamic_symbol (info, h))
return false;
if (h->weakdef != ((void *)0)
&& h->weakdef->dynindx == -1)
{
if (! _bfd_elf_link_record_dynamic_symbol (info, h->weakdef))
return false;
}
}
return true;
}
struct elf_assign_sym_version_info
{
bfd *output_bfd;
struct bfd_link_info *info;
struct bfd_elf_version_tree *verdefs;
boolean failed;
};
struct elf_find_verdep_info
{
bfd *output_bfd;
struct bfd_link_info *info;
unsigned int vers;
boolean failed;
};
static const size_t elf_buckets[] =
{
1, 3, 17, 37, 67, 97, 131, 197, 263, 521, 1031, 2053, 4099, 8209,
16411, 32771, 0
};
# 2963 "elflink.h"
static size_t
compute_bucket_count (info)
struct bfd_link_info *info;
{
size_t dynsymcount = ((struct elf_link_hash_table *) ((info)->hash))->dynsymcount;
size_t best_size = 0;
unsigned long int *hashcodes;
unsigned long int *hashcodesp;
unsigned long int i;
bfd_size_type amt;
amt = dynsymcount;
amt *= sizeof (unsigned long int);
hashcodes = (unsigned long int *) bfd_malloc (amt);
if (hashcodes == ((void *)0))
return 0;
hashcodesp = hashcodes;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_collect_hash_codes), (&hashcodesp)));
if (info->optimize == true)
{
unsigned long int nsyms = hashcodesp - hashcodes;
size_t minsize;
size_t maxsize;
unsigned long best_chlen = ~((unsigned long) 0);
unsigned long int *counts ;
minsize = nsyms / 4;
if (minsize == 0)
minsize = 1;
best_size = maxsize = nsyms * 2;
amt = maxsize;
amt *= sizeof (unsigned long int);
counts = (unsigned long int *) bfd_malloc (amt);
if (counts == ((void *)0))
{
free (hashcodes);
return 0;
}
for (i = minsize; i < maxsize; ++i)
{
unsigned long max;
unsigned long int j;
unsigned long int fact;
(__extension__ (__builtin_constant_p ('\0') && ('\0') == '\0' ? ({ void *__s = (counts); __builtin_memset (__s, '\0', i * sizeof (unsigned long int)); __s; }) : memset (counts, '\0', i * sizeof (unsigned long int))));
for (j = 0; j < nsyms; ++j)
++counts[hashcodes[j] % i];
# 3046 "elflink.h"
max = (2 + nsyms) * (64 / 8);
for (j = 0; j < i; ++j)
max += counts[j] * counts[j];
fact = i / ((4096) / (64 / 8)) + 1;
max *= fact * fact;
# 3072 "elflink.h"
if (max < best_chlen)
{
best_chlen = max;
best_size = i;
}
}
free (counts);
}
else
{
for (i = 0; elf_buckets[i] != 0; i++)
{
best_size = elf_buckets[i];
if (dynsymcount < elf_buckets[i + 1])
break;
}
}
free (hashcodes);
return best_size;
}
boolean
bfd_elf64_size_dynamic_sections (output_bfd, soname, rpath,
filter_shlib,
auxiliary_filters, info, sinterpptr,
verdefs)
bfd *output_bfd;
const char *soname;
const char *rpath;
const char *filter_shlib;
const char * const *auxiliary_filters;
struct bfd_link_info *info;
asection **sinterpptr;
struct bfd_elf_version_tree *verdefs;
{
bfd_size_type soname_indx;
bfd *dynobj;
struct elf_backend_data *bed;
struct elf_assign_sym_version_info asvinfo;
*sinterpptr = ((void *)0);
soname_indx = (bfd_size_type) -1;
if (info->hash->creator->flavour != bfd_target_elf_flavour)
return true;
if (! ((info)->hash->type == bfd_link_elf_hash_table))
return false;
((struct elf_link_hash_table *) ((info)->hash))->init_refcount = -1;
bed = ((struct elf_backend_data *) (output_bfd)->xvec->backend_data);
if (bed->elf_backend_always_size_sections
&& ! (*bed->elf_backend_always_size_sections) (output_bfd, info))
return false;
dynobj = ((struct elf_link_hash_table *) ((info)->hash))->dynobj;
if (dynobj == ((void *)0))
return true;
if (((struct elf_link_hash_table *) ((info)->hash))->dynamic_sections_created)
{
struct elf_info_failed eif;
struct elf_link_hash_entry *h;
asection *dynstr;
*sinterpptr = bfd_get_section_by_name (dynobj, ".interp");
{ if (!(*sinterpptr != ((void *)0) || info->shared)) bfd_assert("elflink.h",3160); };
if (soname != ((void *)0))
{
soname_indx = _bfd_elf_strtab_add (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
soname, true);
if (soname_indx == (bfd_size_type) -1
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 14,
soname_indx))
return false;
}
if (info->symbolic)
{
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 16,
(bfd_vma) 0))
return false;
info->flags |= (1 << 1);
}
if (rpath != ((void *)0))
{
bfd_size_type indx;
indx = _bfd_elf_strtab_add (((struct elf_link_hash_table *) ((info)->hash))->dynstr, rpath,
true);
if (info->new_dtags)
_bfd_elf_strtab_addref (((struct elf_link_hash_table *) ((info)->hash))->dynstr, indx);
if (indx == (bfd_size_type) -1
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 15, indx)
|| (info->new_dtags
&& ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 29,
indx)))
return false;
}
if (filter_shlib != ((void *)0))
{
bfd_size_type indx;
indx = _bfd_elf_strtab_add (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
filter_shlib, true);
if (indx == (bfd_size_type) -1
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0x7fffffff, indx))
return false;
}
if (auxiliary_filters != ((void *)0))
{
const char * const *p;
for (p = auxiliary_filters; *p != ((void *)0); p++)
{
bfd_size_type indx;
indx = _bfd_elf_strtab_add (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
*p, true);
if (indx == (bfd_size_type) -1
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0x7ffffffd,
indx))
return false;
}
}
eif.info = info;
eif.verdefs = verdefs;
eif.failed = false;
if (info->export_dynamic)
{
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_export_symbol), ((void *) &eif)));
if (eif.failed)
return false;
}
asvinfo.output_bfd = output_bfd;
asvinfo.info = info;
asvinfo.verdefs = verdefs;
asvinfo.failed = false;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_link_assign_sym_version), ((void *) &asvinfo)));
if (asvinfo.failed)
return false;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_adjust_dynamic_symbol), ((void *) &eif)));
if (eif.failed)
return false;
h = (info->init_function
? ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (info->init_function), (false), (false), (false)))
: ((void *)0));
if (h != ((void *)0)
&& (h->elf_link_hash_flags & (01
| 02)) != 0)
{
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 12, (bfd_vma) 0))
return false;
}
h = (info->fini_function
? ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (info->fini_function), (false), (false), (false)))
: ((void *)0));
if (h != ((void *)0)
&& (h->elf_link_hash_flags & (01
| 02)) != 0)
{
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 13, (bfd_vma) 0))
return false;
}
dynstr = bfd_get_section_by_name (dynobj, ".dynstr");
if (dynstr != ((void *)0) && dynstr->output_section != ((asection *) &bfd_abs_section))
{
bfd_size_type strsize;
strsize = _bfd_elf_strtab_size (((struct elf_link_hash_table *) ((info)->hash))->dynstr);
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 4, (bfd_vma) 0)
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 5, (bfd_vma) 0)
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 6, (bfd_vma) 0)
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 10, strsize)
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 11,
(bfd_vma) sizeof (Elf64_External_Sym)))
return false;
}
}
if (bed->elf_backend_size_dynamic_sections
&& ! (*bed->elf_backend_size_dynamic_sections) (output_bfd, info))
return false;
if (((struct elf_link_hash_table *) ((info)->hash))->dynamic_sections_created)
{
bfd_size_type dynsymcount;
asection *s;
size_t bucketcount = 0;
size_t hash_entry_size;
unsigned int dtagcount;
s = bfd_get_section_by_name (dynobj, ".gnu.version_d");
{ if (!(s != ((void *)0))) bfd_assert("elflink.h",3325); };
verdefs = asvinfo.verdefs;
if (verdefs == ((void *)0))
_bfd_strip_section_from_output (info, s);
else
{
unsigned int cdefs;
bfd_size_type size;
struct bfd_elf_version_tree *t;
bfd_byte *p;
Elf_Internal_Verdef def;
Elf_Internal_Verdaux defaux;
cdefs = 0;
size = 0;
size += sizeof (Elf_External_Verdef);
size += sizeof (Elf_External_Verdaux);
++cdefs;
for (t = verdefs; t != ((void *)0); t = t->next)
{
struct bfd_elf_version_deps *n;
size += sizeof (Elf_External_Verdef);
size += sizeof (Elf_External_Verdaux);
++cdefs;
for (n = t->deps; n != ((void *)0); n = n->next)
size += sizeof (Elf_External_Verdaux);
}
s->_raw_size = size;
s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size);
if (s->contents == ((void *)0) && s->_raw_size != 0)
return false;
p = s->contents;
def.vd_version = 1;
def.vd_flags = 0x1;
def.vd_ndx = 1;
def.vd_cnt = 1;
def.vd_aux = sizeof (Elf_External_Verdef);
def.vd_next = (sizeof (Elf_External_Verdef)
+ sizeof (Elf_External_Verdaux));
if (soname_indx != (bfd_size_type) -1)
{
_bfd_elf_strtab_addref (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
soname_indx);
def.vd_hash = bfd_elf_hash (soname);
defaux.vda_name = soname_indx;
}
else
{
const char *name;
bfd_size_type indx;
name = basename (output_bfd->filename);
def.vd_hash = bfd_elf_hash (name);
indx = _bfd_elf_strtab_add (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
name, false);
if (indx == (bfd_size_type) -1)
return false;
defaux.vda_name = indx;
}
defaux.vda_next = 0;
_bfd_elf_swap_verdef_out (output_bfd, &def,
(Elf_External_Verdef *) p);
p += sizeof (Elf_External_Verdef);
_bfd_elf_swap_verdaux_out (output_bfd, &defaux,
(Elf_External_Verdaux *) p);
p += sizeof (Elf_External_Verdaux);
for (t = verdefs; t != ((void *)0); t = t->next)
{
unsigned int cdeps;
struct bfd_elf_version_deps *n;
struct elf_link_hash_entry *h;
cdeps = 0;
for (n = t->deps; n != ((void *)0); n = n->next)
++cdeps;
h = ((void *)0);
if (! (_bfd_generic_link_add_one_symbol
(info, dynobj, t->name, 0x02, ((asection *) &bfd_abs_section),
(bfd_vma) 0, (const char *) ((void *)0), false,
((struct elf_backend_data *) (dynobj)->xvec->backend_data)->collect,
(struct bfd_link_hash_entry **) &h)))
return false;
h->elf_link_hash_flags &= ~ 0400;
h->elf_link_hash_flags |= 02;
h->type = 1;
h->verinfo.vertree = t;
if (! _bfd_elf_link_record_dynamic_symbol (info, h))
return false;
def.vd_version = 1;
def.vd_flags = 0;
if (t->globals == ((void *)0) && t->locals == ((void *)0) && ! t->used)
def.vd_flags |= 0x2;
def.vd_ndx = t->vernum + 1;
def.vd_cnt = cdeps + 1;
def.vd_hash = bfd_elf_hash (t->name);
def.vd_aux = sizeof (Elf_External_Verdef);
if (t->next != ((void *)0))
def.vd_next = (sizeof (Elf_External_Verdef)
+ (cdeps + 1) * sizeof (Elf_External_Verdaux));
else
def.vd_next = 0;
_bfd_elf_swap_verdef_out (output_bfd, &def,
(Elf_External_Verdef *) p);
p += sizeof (Elf_External_Verdef);
defaux.vda_name = h->dynstr_index;
_bfd_elf_strtab_addref (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
h->dynstr_index);
if (t->deps == ((void *)0))
defaux.vda_next = 0;
else
defaux.vda_next = sizeof (Elf_External_Verdaux);
t->name_indx = defaux.vda_name;
_bfd_elf_swap_verdaux_out (output_bfd, &defaux,
(Elf_External_Verdaux *) p);
p += sizeof (Elf_External_Verdaux);
for (n = t->deps; n != ((void *)0); n = n->next)
{
if (n->version_needed == ((void *)0))
{
defaux.vda_name = 0;
}
else
{
defaux.vda_name = n->version_needed->name_indx;
_bfd_elf_strtab_addref (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
defaux.vda_name);
}
if (n->next == ((void *)0))
defaux.vda_next = 0;
else
defaux.vda_next = sizeof (Elf_External_Verdaux);
_bfd_elf_swap_verdaux_out (output_bfd, &defaux,
(Elf_External_Verdaux *) p);
p += sizeof (Elf_External_Verdaux);
}
}
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0x6ffffffc, (bfd_vma) 0)
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0x6ffffffd,
(bfd_vma) cdefs))
return false;
((output_bfd) -> tdata.elf_obj_data)->cverdefs = cdefs;
}
if (info->new_dtags && info->flags)
{
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 30, info->flags))
return false;
}
if (info->flags_1)
{
if (! info->shared)
info->flags_1 &= ~ (0x00000020
| 0x00000008
| 0x00000040);
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0x6ffffffb,
info->flags_1))
return false;
}
s = bfd_get_section_by_name (dynobj, ".gnu.version_r");
{ if (!(s != ((void *)0))) bfd_assert("elflink.h",3518); };
{
struct elf_find_verdep_info sinfo;
sinfo.output_bfd = output_bfd;
sinfo.info = info;
sinfo.vers = ((output_bfd) -> tdata.elf_obj_data)->cverdefs;
if (sinfo.vers == 0)
sinfo.vers = 1;
sinfo.failed = false;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_link_find_version_dependencies), ((void *) &sinfo)));
if (((output_bfd) -> tdata.elf_obj_data)->verref == ((void *)0))
_bfd_strip_section_from_output (info, s);
else
{
Elf_Internal_Verneed *t;
unsigned int size;
unsigned int crefs;
bfd_byte *p;
size = 0;
crefs = 0;
for (t = ((output_bfd) -> tdata.elf_obj_data)->verref;
t != ((void *)0);
t = t->vn_nextref)
{
Elf_Internal_Vernaux *a;
size += sizeof (Elf_External_Verneed);
++crefs;
for (a = t->vn_auxptr; a != ((void *)0); a = a->vna_nextptr)
size += sizeof (Elf_External_Vernaux);
}
s->_raw_size = size;
s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size);
if (s->contents == ((void *)0))
return false;
p = s->contents;
for (t = ((output_bfd) -> tdata.elf_obj_data)->verref;
t != ((void *)0);
t = t->vn_nextref)
{
unsigned int caux;
Elf_Internal_Vernaux *a;
bfd_size_type indx;
caux = 0;
for (a = t->vn_auxptr; a != ((void *)0); a = a->vna_nextptr)
++caux;
t->vn_version = 1;
t->vn_cnt = caux;
indx = _bfd_elf_strtab_add (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
(((t->vn_bfd) -> tdata.elf_obj_data) -> dt_name) != ((void *)0)
? (((t->vn_bfd) -> tdata.elf_obj_data) -> dt_name)
: basename (t->vn_bfd->filename),
false);
if (indx == (bfd_size_type) -1)
return false;
t->vn_file = indx;
t->vn_aux = sizeof (Elf_External_Verneed);
if (t->vn_nextref == ((void *)0))
t->vn_next = 0;
else
t->vn_next = (sizeof (Elf_External_Verneed)
+ caux * sizeof (Elf_External_Vernaux));
_bfd_elf_swap_verneed_out (output_bfd, t,
(Elf_External_Verneed *) p);
p += sizeof (Elf_External_Verneed);
for (a = t->vn_auxptr; a != ((void *)0); a = a->vna_nextptr)
{
a->vna_hash = bfd_elf_hash (a->vna_nodename);
indx = _bfd_elf_strtab_add (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
a->vna_nodename, false);
if (indx == (bfd_size_type) -1)
return false;
a->vna_name = indx;
if (a->vna_nextptr == ((void *)0))
a->vna_next = 0;
else
a->vna_next = sizeof (Elf_External_Vernaux);
_bfd_elf_swap_vernaux_out (output_bfd, a,
(Elf_External_Vernaux *) p);
p += sizeof (Elf_External_Vernaux);
}
}
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0x6ffffffe,
(bfd_vma) 0)
|| ! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0x6fffffff,
(bfd_vma) crefs))
return false;
((output_bfd) -> tdata.elf_obj_data)->cverrefs = crefs;
}
}
dynsymcount = _bfd_elf_link_renumber_dynsyms (output_bfd, info);
s = bfd_get_section_by_name (dynobj, ".gnu.version");
{ if (!(s != ((void *)0))) bfd_assert("elflink.h",3634); };
if (dynsymcount == 0
|| (verdefs == ((void *)0) && ((output_bfd) -> tdata.elf_obj_data)->verref == ((void *)0)))
{
_bfd_strip_section_from_output (info, s);
dynsymcount = _bfd_elf_link_renumber_dynsyms (output_bfd, info);
}
else
{
s->_raw_size = dynsymcount * sizeof (Elf_External_Versym);
s->contents = (bfd_byte *) bfd_zalloc (output_bfd, s->_raw_size);
if (s->contents == ((void *)0))
return false;
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0x6ffffff0, (bfd_vma) 0))
return false;
}
s = bfd_get_section_by_name (dynobj, ".dynsym");
{ if (!(s != ((void *)0))) bfd_assert("elflink.h",3661); };
s->_raw_size = dynsymcount * sizeof (Elf64_External_Sym);
s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size);
if (s->contents == ((void *)0) && s->_raw_size != 0)
return false;
if (dynsymcount != 0)
{
Elf_Internal_Sym isym;
isym.st_value = 0;
isym.st_size = 0;
isym.st_name = 0;
isym.st_info = 0;
isym.st_other = 0;
isym.st_shndx = 0;
bfd_elf64_swap_symbol_out (output_bfd, &isym,
(void *) (Elf64_External_Sym *) s->contents);
}
bucketcount = compute_bucket_count (info);
s = bfd_get_section_by_name (dynobj, ".hash");
{ if (!(s != ((void *)0))) bfd_assert("elflink.h",3687); };
hash_entry_size = ((struct bfd_elf_section_data*)s->used_by_bfd)->this_hdr.sh_entsize;
s->_raw_size = ((2 + bucketcount + dynsymcount) * hash_entry_size);
s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size);
if (s->contents == ((void *)0))
return false;
(__extension__ (__builtin_constant_p (0) && (0) == '\0' ? ({ void *__s = (s->contents); __builtin_memset (__s, '\0', (size_t) s->_raw_size); __s; }) : memset (s->contents, 0, (size_t) s->_raw_size)));
( (8 * hash_entry_size) == 8 ? ((void) (*((unsigned char *) (s->contents)) = (unsigned char) ((bfd_vma) bucketcount))) : (8 * hash_entry_size) == 16 ? ((*((output_bfd)->xvec->bfd_putx16)) (((bfd_vma) bucketcount),(s->contents))) : (8 * hash_entry_size) == 32 ? ((*((output_bfd)->xvec->bfd_putx32)) (((bfd_vma) bucketcount),(s->contents))) : (8 * hash_entry_size) == 64 ? ((*((output_bfd)->xvec->bfd_putx64)) (((bfd_vma) bucketcount), (s->contents))) : (_bfd_abort ("elflink.h", 3696, __PRETTY_FUNCTION__), (void) 0));
( (8 * hash_entry_size) == 8 ? ((void) (*((unsigned char *) (s->contents + hash_entry_size)) = (unsigned char) ((bfd_vma) dynsymcount))) : (8 * hash_entry_size) == 16 ? ((*((output_bfd)->xvec->bfd_putx16)) (((bfd_vma) dynsymcount),(s->contents + hash_entry_size))) : (8 * hash_entry_size) == 32 ? ((*((output_bfd)->xvec->bfd_putx32)) (((bfd_vma) dynsymcount),(s->contents + hash_entry_size))) : (8 * hash_entry_size) == 64 ? ((*((output_bfd)->xvec->bfd_putx64)) (((bfd_vma) dynsymcount), (s->contents + hash_entry_size))) : (_bfd_abort ("elflink.h", 3698, __PRETTY_FUNCTION__), (void) 0));
((struct elf_link_hash_table *) ((info)->hash))->bucketcount = bucketcount;
s = bfd_get_section_by_name (dynobj, ".dynstr");
{ if (!(s != ((void *)0))) bfd_assert("elflink.h",3703); };
elf_finalize_dynstr (output_bfd, info);
s->_raw_size = _bfd_elf_strtab_size (((struct elf_link_hash_table *) ((info)->hash))->dynstr);
for (dtagcount = 0; dtagcount <= info->spare_dynamic_tags; ++dtagcount)
if (! bfd_elf64_add_dynamic_entry (info, (bfd_vma) 0, (bfd_vma) 0))
return false;
}
return true;
}
static boolean elf_adjust_dynstr_offsets
(struct elf_link_hash_entry *, void *);
static boolean
elf_adjust_dynstr_offsets (h, data)
struct elf_link_hash_entry *h;
void * data;
{
struct elf_strtab_hash *dynstr = (struct elf_strtab_hash *) data;
if (h->dynindx != -1)
h->dynstr_index = _bfd_elf_strtab_offset (dynstr, h->dynstr_index);
return true;
}
static boolean
elf_finalize_dynstr (output_bfd, info)
bfd *output_bfd;
struct bfd_link_info *info;
{
struct elf_link_local_dynamic_entry *entry;
struct elf_strtab_hash *dynstr = ((struct elf_link_hash_table *) ((info)->hash))->dynstr;
bfd *dynobj = ((struct elf_link_hash_table *) ((info)->hash))->dynobj;
asection *sdyn;
bfd_size_type size;
Elf64_External_Dyn *dyncon, *dynconend;
_bfd_elf_strtab_finalize (dynstr);
size = _bfd_elf_strtab_size (dynstr);
sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
{ if (!(sdyn != ((void *)0))) bfd_assert("elflink.h",3755); };
dyncon = (Elf64_External_Dyn *) sdyn->contents;
dynconend = (Elf64_External_Dyn *) (sdyn->contents +
sdyn->_raw_size);
for (; dyncon < dynconend; dyncon++)
{
Elf_Internal_Dyn dyn;
bfd_elf64_swap_dyn_in (dynobj, dyncon, & dyn);
switch (dyn.d_tag)
{
case 10:
dyn.d_un.d_val = size;
bfd_elf64_swap_dyn_out (dynobj, & dyn, dyncon);
break;
case 1:
case 14:
case 15:
case 29:
case 0x7fffffff:
case 0x7ffffffd:
dyn.d_un.d_val = _bfd_elf_strtab_offset (dynstr, dyn.d_un.d_val);
bfd_elf64_swap_dyn_out (dynobj, & dyn, dyncon);
break;
default:
break;
}
}
for (entry = ((struct elf_link_hash_table *) ((info)->hash))->dynlocal; entry ; entry = entry->next)
entry->isym.st_name = _bfd_elf_strtab_offset (dynstr,
entry->isym.st_name);
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_adjust_dynstr_offsets), (dynstr)));
if (((output_bfd) -> tdata.elf_obj_data)->cverdefs)
{
asection *s;
bfd_byte *p;
bfd_size_type i;
Elf_Internal_Verdef def;
Elf_Internal_Verdaux defaux;
s = bfd_get_section_by_name (dynobj, ".gnu.version_d");
p = (bfd_byte *) s->contents;
do
{
_bfd_elf_swap_verdef_in (output_bfd, (Elf_External_Verdef *) p,
&def);
p += sizeof (Elf_External_Verdef);
for (i = 0; i < def.vd_cnt; ++i)
{
_bfd_elf_swap_verdaux_in (output_bfd,
(Elf_External_Verdaux *) p, &defaux);
defaux.vda_name = _bfd_elf_strtab_offset (dynstr,
defaux.vda_name);
_bfd_elf_swap_verdaux_out (output_bfd,
&defaux, (Elf_External_Verdaux *) p);
p += sizeof (Elf_External_Verdaux);
}
}
while (def.vd_next);
}
if (((output_bfd) -> tdata.elf_obj_data)->verref)
{
asection *s;
bfd_byte *p;
bfd_size_type i;
Elf_Internal_Verneed need;
Elf_Internal_Vernaux needaux;
s = bfd_get_section_by_name (dynobj, ".gnu.version_r");
p = (bfd_byte *) s->contents;
do
{
_bfd_elf_swap_verneed_in (output_bfd, (Elf_External_Verneed *) p,
&need);
need.vn_file = _bfd_elf_strtab_offset (dynstr, need.vn_file);
_bfd_elf_swap_verneed_out (output_bfd, &need,
(Elf_External_Verneed *) p);
p += sizeof (Elf_External_Verneed);
for (i = 0; i < need.vn_cnt; ++i)
{
_bfd_elf_swap_vernaux_in (output_bfd,
(Elf_External_Vernaux *) p, &needaux);
needaux.vna_name = _bfd_elf_strtab_offset (dynstr,
needaux.vna_name);
_bfd_elf_swap_vernaux_out (output_bfd,
&needaux,
(Elf_External_Vernaux *) p);
p += sizeof (Elf_External_Vernaux);
}
}
while (need.vn_next);
}
return true;
}
static boolean
elf_fix_symbol_flags (h, eif)
struct elf_link_hash_entry *h;
struct elf_info_failed *eif;
{
if ((h->elf_link_hash_flags & 0400) != 0)
{
while (h->root.type == bfd_link_hash_indirect)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
if (h->root.type != bfd_link_hash_defined
&& h->root.type != bfd_link_hash_defweak)
h->elf_link_hash_flags |= (01
| 020);
else
{
if (h->root.u.def.section->owner != ((void *)0)
&& (((h->root.u.def.section->owner)->xvec->flavour)
== bfd_target_elf_flavour))
h->elf_link_hash_flags |= (01
| 020);
else
h->elf_link_hash_flags |= 02;
}
if (h->dynindx == -1
&& ((h->elf_link_hash_flags & 010) != 0
|| (h->elf_link_hash_flags & 04) != 0))
{
if (! _bfd_elf_link_record_dynamic_symbol (eif->info, h))
{
eif->failed = true;
return false;
}
}
}
else
{
if ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& (h->elf_link_hash_flags & 02) == 0
&& (h->root.u.def.section->owner != ((void *)0)
? (((h->root.u.def.section->owner)->xvec->flavour)
!= bfd_target_elf_flavour)
: (((h->root.u.def.section) == ((asection *) &bfd_abs_section))
&& (h->elf_link_hash_flags
& 010) == 0)))
h->elf_link_hash_flags |= 02;
}
if (h->root.type == bfd_link_hash_defined
&& (h->elf_link_hash_flags & 02) == 0
&& (h->elf_link_hash_flags & 01) != 0
&& (h->elf_link_hash_flags & 010) == 0
&& (h->root.u.def.section->owner->flags & 0x40) == 0)
h->elf_link_hash_flags |= 02;
# 3947 "elflink.h"
if ((h->elf_link_hash_flags & 0200) != 0
&& eif->info->shared
&& ((eif->info)->hash->type == bfd_link_elf_hash_table)
&& (eif->info->symbolic
|| ((h->other) & 0x3) == 1
|| ((h->other) & 0x3) == 2)
&& (h->elf_link_hash_flags & 02) != 0)
{
struct elf_backend_data *bed;
bed = ((struct elf_backend_data *) (((struct elf_link_hash_table *) ((eif->info)->hash))->dynobj)->xvec->backend_data);
if (((h->other) & 0x3) == 1
|| ((h->other) & 0x3) == 2)
{
h->elf_link_hash_flags |= 02000;
_bfd_elf_strtab_delref (((struct elf_link_hash_table *) ((eif->info)->hash))->dynstr,
h->dynstr_index);
}
(*bed->elf_backend_hide_symbol) (eif->info, h);
}
if (h->weakdef != ((void *)0))
{
struct elf_link_hash_entry *weakdef;
{ if (!(h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak)) bfd_assert("elflink.h",3976); };
weakdef = h->weakdef;
{ if (!(weakdef->root.type == bfd_link_hash_defined || weakdef->root.type == bfd_link_hash_defweak)) bfd_assert("elflink.h",3979); };
{ if (!(weakdef->elf_link_hash_flags & 010)) bfd_assert("elflink.h",3980); };
if ((weakdef->elf_link_hash_flags & 02) != 0)
h->weakdef = ((void *)0);
else
{
struct elf_backend_data *bed;
bed = ((struct elf_backend_data *) (((struct elf_link_hash_table *) ((eif->info)->hash))->dynobj)->xvec->backend_data);
(*bed->elf_backend_copy_indirect_symbol) (weakdef, h);
}
}
return true;
}
static boolean
elf_adjust_dynamic_symbol (h, data)
struct elf_link_hash_entry *h;
void * data;
{
struct elf_info_failed *eif = (struct elf_info_failed *) data;
bfd *dynobj;
struct elf_backend_data *bed;
if (h->root.type == bfd_link_hash_indirect)
return true;
if (! ((eif->info)->hash->type == bfd_link_elf_hash_table))
return false;
if (! elf_fix_symbol_flags (h, eif))
return false;
# 4030 "elflink.h"
if ((h->elf_link_hash_flags & 0200) == 0
&& ((h->elf_link_hash_flags & 02) != 0
|| (h->elf_link_hash_flags & 010) == 0
|| ((h->elf_link_hash_flags & 01) == 0
&& (h->weakdef == ((void *)0) || h->weakdef->dynindx == -1))))
{
h->plt.offset = (bfd_vma) -1;
return true;
}
if ((h->elf_link_hash_flags & 040) != 0)
return true;
h->elf_link_hash_flags |= 040;
# 4079 "elflink.h"
if (h->weakdef != ((void *)0))
{
h->weakdef->elf_link_hash_flags |= 01;
if (! elf_adjust_dynamic_symbol (h->weakdef, (void *) eif))
return false;
}
if (h->size == 0
&& h->type == 0
&& (h->elf_link_hash_flags & 0200) == 0)
(*_bfd_error_handler)
(dcgettext ("bfd", "warning: type and size of dynamic symbol `%s' are not defined", __LC_MESSAGES),
h->root.root.string);
dynobj = ((struct elf_link_hash_table *) ((eif->info)->hash))->dynobj;
bed = ((struct elf_backend_data *) (dynobj)->xvec->backend_data);
if (! (*bed->elf_backend_adjust_dynamic_symbol) (eif->info, h))
{
eif->failed = true;
return false;
}
return true;
}
static boolean
elf_export_symbol (h, data)
struct elf_link_hash_entry *h;
void * data;
{
struct elf_info_failed *eif = (struct elf_info_failed *) data;
if (h->root.type == bfd_link_hash_indirect)
return true;
if (h->dynindx == -1
&& (h->elf_link_hash_flags
& (02 | 01)) != 0)
{
struct bfd_elf_version_tree *t;
struct bfd_elf_version_expr *d;
for (t = eif->verdefs; t != ((void *)0); t = t->next)
{
if (t->globals != ((void *)0))
{
for (d = t->globals; d != ((void *)0); d = d->next)
{
if ((*d->match) (d, h->root.root.string))
goto doit;
}
}
if (t->locals != ((void *)0))
{
for (d = t->locals ; d != ((void *)0); d = d->next)
{
if ((*d->match) (d, h->root.root.string))
return true;
}
}
}
if (!eif->verdefs)
{
doit:
if (! _bfd_elf_link_record_dynamic_symbol (eif->info, h))
{
eif->failed = true;
return false;
}
}
}
return true;
}
static boolean
elf_link_find_version_dependencies (h, data)
struct elf_link_hash_entry *h;
void * data;
{
struct elf_find_verdep_info *rinfo = (struct elf_find_verdep_info *) data;
Elf_Internal_Verneed *t;
Elf_Internal_Vernaux *a;
bfd_size_type amt;
if ((h->elf_link_hash_flags & 010) == 0
|| (h->elf_link_hash_flags & 02) != 0
|| h->dynindx == -1
|| h->verinfo.verdef == ((void *)0))
return true;
for (t = ((rinfo->output_bfd) -> tdata.elf_obj_data)->verref; t != ((void *)0); t = t->vn_nextref)
{
if (t->vn_bfd != h->verinfo.verdef->vd_bfd)
continue;
for (a = t->vn_auxptr; a != ((void *)0); a = a->vna_nextptr)
if (a->vna_nodename == h->verinfo.verdef->vd_nodename)
return true;
break;
}
if (t == ((void *)0))
{
amt = sizeof *t;
t = (Elf_Internal_Verneed *) bfd_zalloc (rinfo->output_bfd, amt);
if (t == ((void *)0))
{
rinfo->failed = true;
return false;
}
t->vn_bfd = h->verinfo.verdef->vd_bfd;
t->vn_nextref = ((rinfo->output_bfd) -> tdata.elf_obj_data)->verref;
((rinfo->output_bfd) -> tdata.elf_obj_data)->verref = t;
}
amt = sizeof *a;
a = (Elf_Internal_Vernaux *) bfd_zalloc (rinfo->output_bfd, amt);
a->vna_nodename = h->verinfo.verdef->vd_nodename;
a->vna_flags = h->verinfo.verdef->vd_flags;
a->vna_nextptr = t->vn_auxptr;
h->verinfo.verdef->vd_exp_refno = rinfo->vers;
++rinfo->vers;
a->vna_other = h->verinfo.verdef->vd_exp_refno + 1;
t->vn_auxptr = a;
return true;
}
static boolean
elf_link_assign_sym_version (h, data)
struct elf_link_hash_entry *h;
void * data;
{
struct elf_assign_sym_version_info *sinfo;
struct bfd_link_info *info;
struct elf_backend_data *bed;
struct elf_info_failed eif;
char *p;
bfd_size_type amt;
sinfo = (struct elf_assign_sym_version_info *) data;
info = sinfo->info;
eif.failed = false;
eif.info = info;
if (! elf_fix_symbol_flags (h, &eif))
{
if (eif.failed)
sinfo->failed = true;
return false;
}
if ((h->elf_link_hash_flags & 02) == 0)
return true;
bed = ((struct elf_backend_data *) (sinfo->output_bfd)->xvec->backend_data);
p = (__extension__ (__builtin_constant_p ('@') && ('@') == '\0' ? (char *) __rawmemchr (h->root.root.string, '@') : strchr (h->root.root.string, '@')));
if (p != ((void *)0) && h->verinfo.vertree == ((void *)0))
{
struct bfd_elf_version_tree *t;
boolean hidden;
hidden = true;
++p;
if (*p == '@')
{
hidden = false;
++p;
}
if (*p == '\0')
{
if (hidden)
h->elf_link_hash_flags |= 01000;
return true;
}
for (t = sinfo->verdefs; t != ((void *)0); t = t->next)
{
if (__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (t->name) && __builtin_constant_p (p) && (__s1_len = strlen (t->name), __s2_len = strlen (p), (!((size_t)(const void *)((t->name) + 1) - (size_t)(const void *)(t->name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((p) + 1) - (size_t)(const void *)(p) == 1) || __s2_len >= 4)) ? memcmp ((__const char *) (t->name), (__const char *) (p), (__s1_len < __s2_len ? __s1_len : __s2_len) + 1) : (__builtin_constant_p (t->name) && ((size_t)(const void *)((t->name) + 1) - (size_t)(const void *)(t->name) == 1) && (__s1_len = strlen (t->name), __s1_len < 4) ? (__builtin_constant_p (p) && ((size_t)(const void *)((p) + 1) - (size_t)(const void *)(p) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (t->name))[0] - ((__const unsigned char *) (__const char *)(p))[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (t->!
name))[1] - ((__const unsigned char *) (__const char *) (p))[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (t->name))[2] - ((__const unsigned char *) (__const char *) (p))[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (t->name))[3] - ((__const unsigned char *) (__const char *) (p))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) (p); register int __result = (((__const unsigned char *) (__const char *) (t->name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (t->name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (t->name))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (t->name))[3] - __s2[3]); } } __result; }))) : (__builtin_c!
onstant_p (p) && ((size_t)(const void *)((p) + 1) - (size_t)(!
const void *)(p) == 1) && (__s2_len = strlen (p), __s2_len < 4) ? (__builtin_constant_p (t->name) && ((size_t)(const void *)((t->name) + 1) - (size_t)(const void *)(t->name) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (t->name))[0] - ((__const unsigned char *) (__const char *)(p))[0]); if (__s2_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (t->name))[1] - ((__const unsigned char *) (__const char *) (p))[1]); if (__s2_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (t->name))[2] - ((__const unsigned char *) (__const char *) (p))[2]); if (__s2_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (t->name))[3] - ((__const unsigned char *) (__const char *) (p))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (t->name); register int __result = __s1[0] - ((__cons!
t unsigned char *) (__const char *) (p))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) (p))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) (p))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) (p))[3]); } } __result; }))) : strcmp (t->name, p)))); }) == 0)
{
size_t len;
char *alc;
struct bfd_elf_version_expr *d;
len = p - h->root.root.string;
alc = bfd_alloc (sinfo->output_bfd, (bfd_size_type) len);
if (alc == ((void *)0))
return false;
(__extension__ (__builtin_constant_p (h->root.root.string) && __builtin_constant_p (len - 1) ? (strlen (h->root.root.string) + 1 >= ((size_t) (len - 1)) ? (char *) memcpy (alc, h->root.root.string, len - 1) : strncpy (alc, h->root.root.string, len - 1)) : strncpy (alc, h->root.root.string, len - 1)));
alc[len - 1] = '\0';
if (alc[len - 2] == '@')
alc[len - 2] = '\0';
h->verinfo.vertree = t;
t->used = true;
d = ((void *)0);
if (t->globals != ((void *)0))
{
for (d = t->globals; d != ((void *)0); d = d->next)
if ((*d->match) (d, alc))
break;
}
if (d == ((void *)0) && t->locals != ((void *)0))
{
for (d = t->locals; d != ((void *)0); d = d->next)
{
if ((*d->match) (d, alc))
{
if (h->dynindx != -1
&& info->shared
&& ! info->export_dynamic)
{
h->elf_link_hash_flags |= 02000;
(*bed->elf_backend_hide_symbol) (info, h);
_bfd_elf_strtab_delref (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
h->dynstr_index);
}
break;
}
}
}
bfd_release (sinfo->output_bfd, alc);
break;
}
}
if (t == ((void *)0) && ! info->shared)
{
struct bfd_elf_version_tree **pp;
int version_index;
if (h->dynindx == -1)
return true;
amt = sizeof *t;
t = ((struct bfd_elf_version_tree *)
bfd_alloc (sinfo->output_bfd, amt));
if (t == ((void *)0))
{
sinfo->failed = true;
return false;
}
t->next = ((void *)0);
t->name = p;
t->globals = ((void *)0);
t->locals = ((void *)0);
t->deps = ((void *)0);
t->name_indx = (unsigned int) -1;
t->used = true;
version_index = 1;
for (pp = &sinfo->verdefs; *pp != ((void *)0); pp = &(*pp)->next)
++version_index;
t->vernum = version_index;
*pp = t;
h->verinfo.vertree = t;
}
else if (t == ((void *)0))
{
(*_bfd_error_handler)
(dcgettext ("bfd", "%s: undefined versioned symbol name %s", __LC_MESSAGES),
((char *) (sinfo->output_bfd)->filename), h->root.root.string);
bfd_set_error (bfd_error_bad_value);
sinfo->failed = true;
return false;
}
if (hidden)
h->elf_link_hash_flags |= 01000;
}
if (h->verinfo.vertree == ((void *)0) && sinfo->verdefs != ((void *)0))
{
struct bfd_elf_version_tree *t;
struct bfd_elf_version_tree *deflt;
struct bfd_elf_version_expr *d;
deflt = ((void *)0);
for (t = sinfo->verdefs; t != ((void *)0); t = t->next)
{
if (t->globals != ((void *)0))
{
for (d = t->globals; d != ((void *)0); d = d->next)
{
if ((*d->match) (d, h->root.root.string))
{
h->verinfo.vertree = t;
break;
}
}
if (d != ((void *)0))
break;
}
if (t->locals != ((void *)0))
{
for (d = t->locals; d != ((void *)0); d = d->next)
{
if (d->pattern[0] == '*' && d->pattern[1] == '\0')
deflt = t;
else if ((*d->match) (d, h->root.root.string))
{
h->verinfo.vertree = t;
if (h->dynindx != -1
&& info->shared
&& ! info->export_dynamic)
{
h->elf_link_hash_flags |= 02000;
(*bed->elf_backend_hide_symbol) (info, h);
_bfd_elf_strtab_delref (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
h->dynstr_index);
}
break;
}
}
if (d != ((void *)0))
break;
}
}
if (deflt != ((void *)0) && h->verinfo.vertree == ((void *)0))
{
h->verinfo.vertree = deflt;
if (h->dynindx != -1
&& info->shared
&& ! info->export_dynamic)
{
h->elf_link_hash_flags |= 02000;
(*bed->elf_backend_hide_symbol) (info, h);
_bfd_elf_strtab_delref (((struct elf_link_hash_table *) ((info)->hash))->dynstr,
h->dynstr_index);
}
}
}
return true;
}
struct elf_final_link_info
{
struct bfd_link_info *info;
bfd *output_bfd;
struct bfd_strtab_hash *symstrtab;
asection *dynsym_sec;
asection *hash_sec;
asection *symver_sec;
bfd_byte *contents;
void * external_relocs;
Elf_Internal_Rela *internal_relocs;
Elf64_External_Sym *external_syms;
Elf_Internal_Sym *internal_syms;
long *indices;
asection **sections;
Elf64_External_Sym *symbuf;
size_t symbuf_count;
size_t symbuf_size;
};
static boolean elf_link_output_sym
(struct elf_final_link_info *, const char *, Elf_Internal_Sym *, asection *);
static boolean elf_link_flush_output_syms
(struct elf_final_link_info *);
static boolean elf_link_output_extsym
(struct elf_link_hash_entry *, void *);
static boolean elf_link_sec_merge_syms
(struct elf_link_hash_entry *, void *);
static boolean elf_link_input_bfd
(struct elf_final_link_info *, bfd *);
static boolean elf_reloc_link_order
(bfd *, struct bfd_link_info *, asection *, struct bfd_link_order *);
struct elf_outext_info
{
boolean failed;
boolean localsyms;
struct elf_final_link_info *finfo;
};
static boolean
elf_link_size_reloc_section (abfd, rel_hdr, o)
bfd *abfd;
Elf_Internal_Shdr *rel_hdr;
asection *o;
{
bfd_size_type reloc_count;
bfd_size_type num_rel_hashes;
if (rel_hdr == &((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr)
reloc_count = ((struct bfd_elf_section_data*)o->used_by_bfd)->rel_count;
else
reloc_count = ((struct bfd_elf_section_data*)o->used_by_bfd)->rel_count2;
num_rel_hashes = o->reloc_count;
if (num_rel_hashes < reloc_count)
num_rel_hashes = reloc_count;
rel_hdr->sh_size = rel_hdr->sh_entsize * reloc_count;
rel_hdr->contents = (void *) bfd_zalloc (abfd, rel_hdr->sh_size);
if (rel_hdr->contents == ((void *)0) && rel_hdr->sh_size != 0)
return false;
if (((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hashes == ((void *)0)
&& num_rel_hashes)
{
struct elf_link_hash_entry **p;
p = ((struct elf_link_hash_entry **)
bfd_zmalloc (num_rel_hashes
* sizeof (struct elf_link_hash_entry *)));
if (p == ((void *)0))
return false;
((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hashes = p;
}
return true;
}
static void
elf_link_adjust_relocs (abfd, rel_hdr, count, rel_hash)
bfd *abfd;
Elf_Internal_Shdr *rel_hdr;
unsigned int count;
struct elf_link_hash_entry **rel_hash;
{
unsigned int i;
struct elf_backend_data *bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
Elf_Internal_Rel *irel;
Elf_Internal_Rela *irela;
bfd_size_type amt = sizeof (Elf_Internal_Rel) * bed->s->int_rels_per_ext_rel;
irel = (Elf_Internal_Rel *) bfd_zmalloc (amt);
if (irel == ((void *)0))
{
(*_bfd_error_handler) (dcgettext ("bfd", "Error: out of memory", __LC_MESSAGES));
_bfd_abort ("elflink.h", 4633, __PRETTY_FUNCTION__);
}
amt = sizeof (Elf_Internal_Rela) * bed->s->int_rels_per_ext_rel;
irela = (Elf_Internal_Rela *) bfd_zmalloc (amt);
if (irela == ((void *)0))
{
(*_bfd_error_handler) (dcgettext ("bfd", "Error: out of memory", __LC_MESSAGES));
_bfd_abort ("elflink.h", 4641, __PRETTY_FUNCTION__);
}
for (i = 0; i < count; i++, rel_hash++)
{
if (*rel_hash == ((void *)0))
continue;
{ if (!((*rel_hash)->indx >= 0)) bfd_assert("elflink.h",4649); };
if (rel_hdr->sh_entsize == sizeof (Elf64_External_Rel))
{
Elf64_External_Rel *erel;
unsigned int j;
erel = (Elf64_External_Rel *) rel_hdr->contents + i;
if (bed->s->swap_reloc_in)
(*bed->s->swap_reloc_in) (abfd, (bfd_byte *) erel, irel);
else
bfd_elf64_swap_reloc_in (abfd, erel, irel);
for (j = 0; j < bed->s->int_rels_per_ext_rel; j++)
irel[j].r_info = (((bfd_vma) ((*rel_hash)->indx) << 32) + (bfd_vma) (((irel[j].r_info) & 0xffffffff)));
if (bed->s->swap_reloc_out)
(*bed->s->swap_reloc_out) (abfd, irel, (bfd_byte *) erel);
else
bfd_elf64_swap_reloc_out (abfd, irel, erel);
}
else
{
Elf64_External_Rela *erela;
unsigned int j;
{ if (!(rel_hdr->sh_entsize == sizeof (Elf64_External_Rela))) bfd_assert("elflink.h",4677); };
erela = (Elf64_External_Rela *) rel_hdr->contents + i;
if (bed->s->swap_reloca_in)
(*bed->s->swap_reloca_in) (abfd, (bfd_byte *) erela, irela);
else
bfd_elf64_swap_reloca_in (abfd, erela, irela);
for (j = 0; j < bed->s->int_rels_per_ext_rel; j++)
irela[j].r_info = (((bfd_vma) ((*rel_hash)->indx) << 32) + (bfd_vma) (((irela[j].r_info) & 0xffffffff)));
if (bed->s->swap_reloca_out)
(*bed->s->swap_reloca_out) (abfd, irela, (bfd_byte *) erela);
else
bfd_elf64_swap_reloca_out (abfd, irela, erela);
}
}
free (irel);
free (irela);
}
struct elf_link_sort_rela {
bfd_vma offset;
enum elf_reloc_type_class type;
union {
Elf_Internal_Rel rel;
Elf_Internal_Rela rela;
} u;
};
static int
elf_link_sort_cmp1 (A, B)
const void * A;
const void * B;
{
struct elf_link_sort_rela *a = (struct elf_link_sort_rela *) A;
struct elf_link_sort_rela *b = (struct elf_link_sort_rela *) B;
int relativea, relativeb;
relativea = a->type == reloc_class_relative;
relativeb = b->type == reloc_class_relative;
if (relativea < relativeb)
return 1;
if (relativea > relativeb)
return -1;
if (((a->u.rel.r_info) >> 32) < ((b->u.rel.r_info) >> 32))
return -1;
if (((a->u.rel.r_info) >> 32) > ((b->u.rel.r_info) >> 32))
return 1;
if (a->u.rel.r_offset < b->u.rel.r_offset)
return -1;
if (a->u.rel.r_offset > b->u.rel.r_offset)
return 1;
return 0;
}
static int
elf_link_sort_cmp2 (A, B)
const void * A;
const void * B;
{
struct elf_link_sort_rela *a = (struct elf_link_sort_rela *) A;
struct elf_link_sort_rela *b = (struct elf_link_sort_rela *) B;
int copya, copyb;
if (a->offset < b->offset)
return -1;
if (a->offset > b->offset)
return 1;
copya = (a->type == reloc_class_copy) * 2 + (a->type == reloc_class_plt);
copyb = (b->type == reloc_class_copy) * 2 + (b->type == reloc_class_plt);
if (copya < copyb)
return -1;
if (copya > copyb)
return 1;
if (a->u.rel.r_offset < b->u.rel.r_offset)
return -1;
if (a->u.rel.r_offset > b->u.rel.r_offset)
return 1;
return 0;
}
static size_t
elf_link_sort_relocs (abfd, info, psec)
bfd *abfd;
struct bfd_link_info *info;
asection **psec;
{
bfd *dynobj = ((struct elf_link_hash_table *) ((info)->hash))->dynobj;
asection *reldyn, *o;
boolean rel = false;
bfd_size_type count, size;
size_t i, j, ret;
struct elf_link_sort_rela *rela;
struct elf_backend_data *bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
reldyn = bfd_get_section_by_name (abfd, ".rela.dyn");
if (reldyn == ((void *)0) || reldyn->_raw_size == 0)
{
reldyn = bfd_get_section_by_name (abfd, ".rel.dyn");
if (reldyn == ((void *)0) || reldyn->_raw_size == 0)
return 0;
rel = true;
count = reldyn->_raw_size / sizeof (Elf64_External_Rel);
}
else
count = reldyn->_raw_size / sizeof (Elf64_External_Rela);
size = 0;
for (o = dynobj->sections; o != ((void *)0); o = o->next)
if ((o->flags & (0x200|0x800000))
== (0x200|0x800000)
&& o->output_section == reldyn)
size += o->_raw_size;
if (size != reldyn->_raw_size)
return 0;
rela = (struct elf_link_sort_rela *) bfd_zmalloc (sizeof (*rela) * count);
if (rela == ((void *)0))
{
(*info->callbacks->warning)
(info, dcgettext ("bfd", "Not enough memory to sort relocations", __LC_MESSAGES), 0, abfd, 0,
(bfd_vma) 0);
return 0;
}
for (o = dynobj->sections; o != ((void *)0); o = o->next)
if ((o->flags & (0x200|0x800000))
== (0x200|0x800000)
&& o->output_section == reldyn)
{
if (rel)
{
Elf64_External_Rel *erel, *erelend;
struct elf_link_sort_rela *s;
erel = (Elf64_External_Rel *) o->contents;
erelend = (Elf64_External_Rel *) (o->contents + o->_raw_size);
s = rela + o->output_offset / sizeof (Elf64_External_Rel);
for (; erel < erelend; erel++, s++)
{
if (bed->s->swap_reloc_in)
(*bed->s->swap_reloc_in) (abfd, (bfd_byte *) erel, &s->u.rel);
else
bfd_elf64_swap_reloc_in (abfd, erel, &s->u.rel);
s->type = (*bed->elf_backend_reloc_type_class) (&s->u.rela);
}
}
else
{
Elf64_External_Rela *erela, *erelaend;
struct elf_link_sort_rela *s;
erela = (Elf64_External_Rela *) o->contents;
erelaend = (Elf64_External_Rela *) (o->contents + o->_raw_size);
s = rela + o->output_offset / sizeof (Elf64_External_Rela);
for (; erela < erelaend; erela++, s++)
{
if (bed->s->swap_reloca_in)
(*bed->s->swap_reloca_in) (dynobj, (bfd_byte *) erela,
&s->u.rela);
else
bfd_elf64_swap_reloca_in (dynobj, erela, &s->u.rela);
s->type = (*bed->elf_backend_reloc_type_class) (&s->u.rela);
}
}
}
qsort (rela, (size_t) count, sizeof (*rela), elf_link_sort_cmp1);
for (ret = 0; ret < count && rela[ret].type == reloc_class_relative; ret++)
;
for (i = ret, j = ret; i < count; i++)
{
if (((rela[i].u.rel.r_info) >> 32) != ((rela[j].u.rel.r_info) >> 32))
j = i;
rela[i].offset = rela[j].u.rel.r_offset;
}
qsort (rela + ret, (size_t) count - ret, sizeof (*rela), elf_link_sort_cmp2);
for (o = dynobj->sections; o != ((void *)0); o = o->next)
if ((o->flags & (0x200|0x800000))
== (0x200|0x800000)
&& o->output_section == reldyn)
{
if (rel)
{
Elf64_External_Rel *erel, *erelend;
struct elf_link_sort_rela *s;
erel = (Elf64_External_Rel *) o->contents;
erelend = (Elf64_External_Rel *) (o->contents + o->_raw_size);
s = rela + o->output_offset / sizeof (Elf64_External_Rel);
for (; erel < erelend; erel++, s++)
{
if (bed->s->swap_reloc_out)
(*bed->s->swap_reloc_out) (abfd, &s->u.rel,
(bfd_byte *) erel);
else
bfd_elf64_swap_reloc_out (abfd, &s->u.rel, erel);
}
}
else
{
Elf64_External_Rela *erela, *erelaend;
struct elf_link_sort_rela *s;
erela = (Elf64_External_Rela *) o->contents;
erelaend = (Elf64_External_Rela *) (o->contents + o->_raw_size);
s = rela + o->output_offset / sizeof (Elf64_External_Rela);
for (; erela < erelaend; erela++, s++)
{
if (bed->s->swap_reloca_out)
(*bed->s->swap_reloca_out) (dynobj, &s->u.rela,
(bfd_byte *) erela);
else
bfd_elf64_swap_reloca_out (dynobj, &s->u.rela, erela);
}
}
}
free (rela);
*psec = reldyn;
return ret;
}
boolean
bfd_elf64_bfd_final_link (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
boolean dynamic;
boolean emit_relocs;
bfd *dynobj;
struct elf_final_link_info finfo;
register asection *o;
register struct bfd_link_order *p;
register bfd *sub;
bfd_size_type max_contents_size;
bfd_size_type max_external_reloc_size;
bfd_size_type max_internal_reloc_count;
bfd_size_type max_sym_count;
file_ptr off;
Elf_Internal_Sym elfsym;
unsigned int i;
Elf_Internal_Shdr *symtab_hdr;
Elf_Internal_Shdr *symstrtab_hdr;
struct elf_backend_data *bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
struct elf_outext_info eoinfo;
boolean merged;
size_t relativecount = 0;
asection *reldyn = 0;
bfd_size_type amt;
if (! ((info)->hash->type == bfd_link_elf_hash_table))
return false;
if (info->shared)
abfd->flags |= 0x40;
dynamic = ((struct elf_link_hash_table *) ((info)->hash))->dynamic_sections_created;
dynobj = ((struct elf_link_hash_table *) ((info)->hash))->dynobj;
emit_relocs = (info->relocateable
|| info->emitrelocations
|| bed->elf_backend_emit_relocs);
finfo.info = info;
finfo.output_bfd = abfd;
finfo.symstrtab = _bfd_elf_stringtab_init ();
if (finfo.symstrtab == ((void *)0))
return false;
if (! dynamic)
{
finfo.dynsym_sec = ((void *)0);
finfo.hash_sec = ((void *)0);
finfo.symver_sec = ((void *)0);
}
else
{
finfo.dynsym_sec = bfd_get_section_by_name (dynobj, ".dynsym");
finfo.hash_sec = bfd_get_section_by_name (dynobj, ".hash");
{ if (!(finfo.dynsym_sec != ((void *)0) && finfo.hash_sec != ((void *)0))) bfd_assert("elflink.h",4967); };
finfo.symver_sec = bfd_get_section_by_name (dynobj, ".gnu.version");
}
finfo.contents = ((void *)0);
finfo.external_relocs = ((void *)0);
finfo.internal_relocs = ((void *)0);
finfo.external_syms = ((void *)0);
finfo.internal_syms = ((void *)0);
finfo.indices = ((void *)0);
finfo.sections = ((void *)0);
finfo.symbuf = ((void *)0);
finfo.symbuf_count = 0;
max_contents_size = 0;
max_external_reloc_size = 0;
max_internal_reloc_count = 0;
max_sym_count = 0;
merged = false;
for (o = abfd->sections; o != (asection *) ((void *)0); o = o->next)
{
o->reloc_count = 0;
for (p = o->link_order_head; p != ((void *)0); p = p->next)
{
if (p->type == bfd_section_reloc_link_order
|| p->type == bfd_symbol_reloc_link_order)
++o->reloc_count;
else if (p->type == bfd_indirect_link_order)
{
asection *sec;
sec = p->u.indirect.section;
sec->linker_mark = true;
if (sec->flags & 0x20000000)
merged = true;
if (info->relocateable || info->emitrelocations)
o->reloc_count += sec->reloc_count;
else if (bed->elf_backend_count_relocs)
{
Elf_Internal_Rela * relocs;
relocs = (_bfd_elf64_link_read_relocs
(abfd, sec, (void *) ((void *)0),
(Elf_Internal_Rela *) ((void *)0), info->keep_memory));
o->reloc_count += (*bed->elf_backend_count_relocs)
(sec, relocs);
if (!info->keep_memory)
free (relocs);
}
if (sec->_raw_size > max_contents_size)
max_contents_size = sec->_raw_size;
if (sec->_cooked_size > max_contents_size)
max_contents_size = sec->_cooked_size;
if (((sec->owner)->xvec->flavour) == bfd_target_elf_flavour
&& (sec->owner->flags & 0x40) == 0)
{
size_t sym_count;
if ((((sec->owner) -> tdata.elf_obj_data) -> bad_symtab))
sym_count = (((sec->owner) -> tdata.elf_obj_data)->symtab_hdr.sh_size
/ sizeof (Elf64_External_Sym));
else
sym_count = ((sec->owner) -> tdata.elf_obj_data)->symtab_hdr.sh_info;
if (sym_count > max_sym_count)
max_sym_count = sym_count;
if ((sec->flags & 0x004) != 0)
{
size_t ext_size;
ext_size = ((struct bfd_elf_section_data*)sec->used_by_bfd)->rel_hdr.sh_size;
if (ext_size > max_external_reloc_size)
max_external_reloc_size = ext_size;
if (sec->reloc_count > max_internal_reloc_count)
max_internal_reloc_count = sec->reloc_count;
}
}
}
}
if (o->reloc_count > 0)
o->flags |= 0x004;
else
{
o->flags &=~ 0x004;
}
if ((o->flags & 0x001) == 0
&& ! o->user_set_vma)
o->vma = 0;
}
if (! info->relocateable && merged)
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_link_sec_merge_syms), ((void *) abfd)));
((abfd)->symcount) = info->strip == strip_all ? 0 : 1;
{ if (!(! abfd->output_has_begun)) bfd_assert("elflink.h",5093); };
if (! _bfd_elf_compute_section_file_positions (abfd, info))
goto error_return;
if (emit_relocs)
for (sub = info->input_bfds; sub != ((void *)0); sub = sub->link_next)
for (o = sub->sections; o != ((void *)0); o = o->next)
{
asection *output_section;
if (! o->linker_mark)
{
continue;
}
output_section = o->output_section;
if (output_section != ((void *)0)
&& (o->flags & 0x004) != 0)
{
struct bfd_elf_section_data *esdi
= ((struct bfd_elf_section_data*)o->used_by_bfd);
struct bfd_elf_section_data *esdo
= ((struct bfd_elf_section_data*)output_section->used_by_bfd);
unsigned int *rel_count;
unsigned int *rel_count2;
if (esdi->rel_hdr.sh_entsize == esdo->rel_hdr.sh_entsize)
{
rel_count = &esdo->rel_count;
rel_count2 = &esdo->rel_count2;
}
else
{
rel_count = &esdo->rel_count2;
rel_count2 = &esdo->rel_count;
}
*rel_count += ((& esdi->rel_hdr)->sh_size / (& esdi->rel_hdr)->sh_entsize);
if (esdi->rel_hdr2)
*rel_count2 += ((esdi->rel_hdr2)->sh_size / (esdi->rel_hdr2)->sh_entsize);
output_section->flags |= 0x004;
}
}
for (o = abfd->sections; o != ((void *)0); o = o->next)
{
if ((o->flags & 0x004) != 0)
{
if (!elf_link_size_reloc_section (abfd,
&((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr,
o))
goto error_return;
if (((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr2
&& !elf_link_size_reloc_section (abfd,
((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr2,
o))
goto error_return;
}
((struct bfd_elf_section_data*)o->used_by_bfd)->rel_count = 0;
((struct bfd_elf_section_data*)o->used_by_bfd)->rel_count2 = 0;
}
_bfd_elf_assign_file_positions_for_relocs (abfd);
((abfd)->symcount) = 0;
symtab_hdr = &((abfd) -> tdata.elf_obj_data)->symtab_hdr;
symtab_hdr->sh_type = 2;
symtab_hdr->sh_flags = 0;
symtab_hdr->sh_addr = 0;
symtab_hdr->sh_size = 0;
symtab_hdr->sh_entsize = sizeof (Elf64_External_Sym);
symtab_hdr->sh_addralign = bed->s->file_align;
off = ((abfd) -> tdata.elf_obj_data)->next_file_pos;
off = _bfd_elf_assign_file_position_for_section (symtab_hdr, off, true);
if (! info->keep_memory || max_sym_count < 20)
finfo.symbuf_size = 20;
else
finfo.symbuf_size = max_sym_count;
amt = finfo.symbuf_size;
amt *= sizeof (Elf64_External_Sym);
finfo.symbuf = (Elf64_External_Sym *) bfd_malloc (amt);
if (finfo.symbuf == ((void *)0))
goto error_return;
if (info->strip != strip_all
|| emit_relocs)
{
elfsym.st_value = 0;
elfsym.st_size = 0;
elfsym.st_info = 0;
elfsym.st_other = 0;
elfsym.st_shndx = 0;
if (! elf_link_output_sym (&finfo, (const char *) ((void *)0),
&elfsym, ((asection *) &bfd_und_section)))
goto error_return;
}
# 5242 "elflink.h"
if (info->strip != strip_all
|| emit_relocs)
{
elfsym.st_size = 0;
elfsym.st_info = (((0) << 4) + ((3) & 0xF));
elfsym.st_other = 0;
for (i = 1; i < (((abfd) -> tdata.elf_obj_data) -> elf_header)->e_shnum; i++)
{
o = bfd_section_from_elf_index (abfd, i);
if (o != ((void *)0))
o->target_index = ((abfd)->symcount);
elfsym.st_shndx = i;
if (info->relocateable || o == ((void *)0))
elfsym.st_value = 0;
else
elfsym.st_value = o->vma;
if (! elf_link_output_sym (&finfo, (const char *) ((void *)0),
&elfsym, o))
goto error_return;
}
}
finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
finfo.external_relocs = (void *) bfd_malloc (max_external_reloc_size);
finfo.internal_relocs = ((Elf_Internal_Rela *)
bfd_malloc (max_internal_reloc_count
* sizeof (Elf_Internal_Rela)
* bed->s->int_rels_per_ext_rel));
finfo.external_syms = ((Elf64_External_Sym *)
bfd_malloc (max_sym_count
* sizeof (Elf64_External_Sym)));
finfo.internal_syms = ((Elf_Internal_Sym *)
bfd_malloc (max_sym_count
* sizeof (Elf_Internal_Sym)));
finfo.indices = (long *) bfd_malloc (max_sym_count * sizeof (long));
finfo.sections = ((asection **)
bfd_malloc (max_sym_count * sizeof (asection *)));
if ((finfo.contents == ((void *)0) && max_contents_size != 0)
|| (finfo.external_relocs == ((void *)0) && max_external_reloc_size != 0)
|| (finfo.internal_relocs == ((void *)0) && max_internal_reloc_count != 0)
|| (finfo.external_syms == ((void *)0) && max_sym_count != 0)
|| (finfo.internal_syms == ((void *)0) && max_sym_count != 0)
|| (finfo.indices == ((void *)0) && max_sym_count != 0)
|| (finfo.sections == ((void *)0) && max_sym_count != 0))
goto error_return;
# 5310 "elflink.h"
for (sub = info->input_bfds; sub != ((void *)0); sub = sub->link_next)
sub->output_has_begun = false;
for (o = abfd->sections; o != ((void *)0); o = o->next)
{
for (p = o->link_order_head; p != ((void *)0); p = p->next)
{
if (p->type == bfd_indirect_link_order
&& (((p->u.indirect.section->owner)->xvec->flavour)
== bfd_target_elf_flavour))
{
sub = p->u.indirect.section->owner;
if (! sub->output_has_begun)
{
if (! elf_link_input_bfd (&finfo, sub))
goto error_return;
sub->output_has_begun = true;
}
}
else if (p->type == bfd_section_reloc_link_order
|| p->type == bfd_symbol_reloc_link_order)
{
if (! elf_reloc_link_order (abfd, info, o, p))
goto error_return;
}
else
{
if (! _bfd_default_link_order (abfd, info, o, p))
goto error_return;
}
}
}
if (info->shared)
{
eoinfo.failed = false;
eoinfo.finfo = &finfo;
eoinfo.localsyms = true;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_link_output_extsym), ((void *) &eoinfo)));
if (eoinfo.failed)
return false;
}
symtab_hdr->sh_info = ((abfd)->symcount);
if (dynamic
&& finfo.dynsym_sec->output_section != ((asection *) &bfd_abs_section))
{
Elf_Internal_Sym sym;
Elf64_External_Sym *dynsym =
(Elf64_External_Sym *) finfo.dynsym_sec->contents;
long last_local = 0;
if (info->shared)
{
asection *s;
sym.st_size = 0;
sym.st_name = 0;
sym.st_info = (((0) << 4) + ((3) & 0xF));
sym.st_other = 0;
for (s = abfd->sections; s != ((void *)0); s = s->next)
{
int indx;
indx = ((struct bfd_elf_section_data*)s->used_by_bfd)->this_idx;
{ if (!(indx > 0)) bfd_assert("elflink.h",5389); };
sym.st_shndx = indx;
sym.st_value = s->vma;
bfd_elf64_swap_symbol_out (abfd, &sym,
dynsym + ((struct bfd_elf_section_data*)s->used_by_bfd)->dynindx);
}
last_local = ((abfd)->section_count);
}
if (((struct elf_link_hash_table *) ((info)->hash))->dynlocal)
{
struct elf_link_local_dynamic_entry *e;
for (e = ((struct elf_link_hash_table *) ((info)->hash))->dynlocal; e ; e = e->next)
{
asection *s;
sym.st_size = e->isym.st_size;
sym.st_other = e->isym.st_other;
sym = e->isym;
if (e->isym.st_shndx > 0 && e->isym.st_shndx < 0xFF00)
{
s = bfd_section_from_elf_index (e->input_bfd,
e->isym.st_shndx);
sym.st_shndx =
((struct bfd_elf_section_data*)s->output_section->used_by_bfd)->this_idx;
sym.st_value = (s->output_section->vma
+ s->output_offset
+ e->isym.st_value);
}
if (last_local < e->dynindx)
last_local = e->dynindx;
bfd_elf64_swap_symbol_out (abfd, &sym, dynsym + e->dynindx);
}
}
((struct bfd_elf_section_data*)finfo.dynsym_sec->output_section->used_by_bfd)->this_hdr.sh_info =
last_local + 1;
}
eoinfo.failed = false;
eoinfo.localsyms = false;
eoinfo.finfo = &finfo;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_link_output_extsym), ((void *) &eoinfo)));
if (eoinfo.failed)
return false;
if (bed->elf_backend_output_arch_syms)
{
typedef boolean (*out_sym_func) (void *, const char *, Elf_Internal_Sym *, asection *);
if (! ((*bed->elf_backend_output_arch_syms)
(abfd, info, (void *) &finfo, (out_sym_func) elf_link_output_sym)))
return false;
}
if (! elf_link_flush_output_syms (&finfo))
return false;
off += symtab_hdr->sh_size;
symstrtab_hdr = &((abfd) -> tdata.elf_obj_data)->strtab_hdr;
symstrtab_hdr->sh_type = 3;
symstrtab_hdr->sh_flags = 0;
symstrtab_hdr->sh_addr = 0;
symstrtab_hdr->sh_size = _bfd_stringtab_size (finfo.symstrtab);
symstrtab_hdr->sh_entsize = 0;
symstrtab_hdr->sh_link = 0;
symstrtab_hdr->sh_info = 0;
symstrtab_hdr->sh_addralign = 1;
off = _bfd_elf_assign_file_position_for_section (symstrtab_hdr, off, true);
((abfd) -> tdata.elf_obj_data)->next_file_pos = off;
if (((abfd)->symcount) > 0)
{
if (bfd_seek (abfd, symstrtab_hdr->sh_offset, 0) != 0
|| ! _bfd_stringtab_emit (abfd, finfo.symstrtab))
return false;
}
for (o = abfd->sections; o != ((void *)0); o = o->next)
{
if ((o->flags & 0x004) == 0)
continue;
elf_link_adjust_relocs (abfd, &((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr,
((struct bfd_elf_section_data*)o->used_by_bfd)->rel_count,
((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hashes);
if (((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr2 != ((void *)0))
elf_link_adjust_relocs (abfd, ((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr2,
((struct bfd_elf_section_data*)o->used_by_bfd)->rel_count2,
(((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hashes
+ ((struct bfd_elf_section_data*)o->used_by_bfd)->rel_count));
o->reloc_count = 0;
}
if (dynamic && info->combreloc && dynobj != ((void *)0))
relativecount = elf_link_sort_relocs (abfd, info, &reldyn);
if (dynamic)
{
Elf64_External_Dyn *dyncon, *dynconend;
o = bfd_get_section_by_name (dynobj, ".dynamic");
{ if (!(o != ((void *)0))) bfd_assert("elflink.h",5523); };
dyncon = (Elf64_External_Dyn *) o->contents;
dynconend = (Elf64_External_Dyn *) (o->contents + o->_raw_size);
for (; dyncon < dynconend; dyncon++)
{
Elf_Internal_Dyn dyn;
const char *name;
unsigned int type;
bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
switch (dyn.d_tag)
{
default:
break;
case 0:
if (relativecount > 0 && dyncon + 1 < dynconend)
{
switch (((struct bfd_elf_section_data*)reldyn->used_by_bfd)->this_hdr.sh_type)
{
case 9: dyn.d_tag = 0x6ffffffa; break;
case 4: dyn.d_tag = 0x6ffffff9; break;
default: break;
}
if (dyn.d_tag != 0)
{
dyn.d_un.d_val = relativecount;
bfd_elf64_swap_dyn_out (dynobj, &dyn, dyncon);
relativecount = 0;
}
}
break;
case 12:
name = info->init_function;
goto get_sym;
case 13:
name = info->fini_function;
get_sym:
{
struct elf_link_hash_entry *h;
h = ((struct elf_link_hash_entry *) bfd_link_hash_lookup (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (name), (false), (false), (true)));
if (h != ((void *)0)
&& (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak))
{
dyn.d_un.d_val = h->root.u.def.value;
o = h->root.u.def.section;
if (o->output_section != ((void *)0))
dyn.d_un.d_val += (o->output_section->vma
+ o->output_offset);
else
{
dyn.d_un.d_val = 0;
}
bfd_elf64_swap_dyn_out (dynobj, &dyn, dyncon);
}
}
break;
case 4:
name = ".hash";
goto get_vma;
case 5:
name = ".dynstr";
goto get_vma;
case 6:
name = ".dynsym";
goto get_vma;
case 0x6ffffffc:
name = ".gnu.version_d";
goto get_vma;
case 0x6ffffffe:
name = ".gnu.version_r";
goto get_vma;
case 0x6ffffff0:
name = ".gnu.version";
get_vma:
o = bfd_get_section_by_name (abfd, name);
{ if (!(o != ((void *)0))) bfd_assert("elflink.h",5607); };
dyn.d_un.d_ptr = o->vma;
bfd_elf64_swap_dyn_out (dynobj, &dyn, dyncon);
break;
case 17:
case 7:
case 18:
case 8:
if (dyn.d_tag == 17 || dyn.d_tag == 18)
type = 9;
else
type = 4;
dyn.d_un.d_val = 0;
for (i = 1; i < (((abfd) -> tdata.elf_obj_data) -> elf_header)->e_shnum; i++)
{
Elf_Internal_Shdr *hdr;
hdr = (((abfd) -> tdata.elf_obj_data) -> elf_sect_ptr)[i];
if (hdr->sh_type == type
&& (hdr->sh_flags & (1 << 1)) != 0)
{
if (dyn.d_tag == 18 || dyn.d_tag == 8)
dyn.d_un.d_val += hdr->sh_size;
else
{
if (dyn.d_un.d_val == 0
|| hdr->sh_addr < dyn.d_un.d_val)
dyn.d_un.d_val = hdr->sh_addr;
}
}
}
bfd_elf64_swap_dyn_out (dynobj, &dyn, dyncon);
break;
}
}
}
if (dynobj != ((void *)0))
{
if (! (*bed->elf_backend_finish_dynamic_sections) (abfd, info))
goto error_return;
for (o = dynobj->sections; o != ((void *)0); o = o->next)
{
if ((o->flags & 0x200) == 0
|| o->_raw_size == 0
|| o->output_section == ((asection *) &bfd_abs_section))
continue;
if ((o->flags & 0x800000) == 0)
{
continue;
}
if ((((struct bfd_elf_section_data*)o->output_section->used_by_bfd)->this_hdr.sh_type
!= 3)
|| __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (((o)->name + 0)) && __builtin_constant_p (".dynstr") && (__s1_len = strlen (((o)->name + 0)), __s2_len = strlen (".dynstr"), (!((size_t)(const void *)((((o)->name + 0)) + 1) - (size_t)(const void *)(((o)->name + 0)) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((".dynstr") + 1) - (size_t)(const void *)(".dynstr") == 1) || __s2_len >= 4)) ? memcmp ((__const char *) (((o)->name + 0)), (__const char *) (".dynstr"), (__s1_len < __s2_len ? __s1_len : __s2_len) + 1) : (__builtin_constant_p (((o)->name + 0)) && ((size_t)(const void *)((((o)->name + 0)) + 1) - (size_t)(const void *)(((o)->name + 0)) == 1) && (__s1_len = strlen (((o)->name + 0)), __s1_len < 4) ? (__builtin_constant_p (".dynstr") && ((size_t)(const void *)((".dynstr") + 1) - (size_t)(const void *)(".dynstr") == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[0] - ((_!
_const unsigned char *) (__const char *)(".dynstr"))[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[1] - ((__const unsigned char *) (__const char *) (".dynstr"))[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[2] - ((__const unsigned char *) (__const char *) (".dynstr"))[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[3] - ((__const unsigned char *) (__const char *) (".dynstr"))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) (".dynstr"); register int __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __res!
ult = (((__const unsigned char *) (__const char *) (((o)->nam!
e + 0)))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (".dynstr") && ((size_t)(const void *)((".dynstr") + 1) - (size_t)(const void *)(".dynstr") == 1) && (__s2_len = strlen (".dynstr"), __s2_len < 4) ? (__builtin_constant_p (((o)->name + 0)) && ((size_t)(const void *)((((o)->name + 0)) + 1) - (size_t)(const void *)(((o)->name + 0)) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[0] - ((__const unsigned char *) (__const char *)(".dynstr"))[0]); if (__s2_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[1] - ((__const unsigned char *) (__const char *) (".dynstr"))[1]); if (__s2_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[2] - ((__const unsigned char *) (__const char!
*) (".dynstr"))[2]); if (__s2_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (((o)->name + 0)))[3] - ((__const unsigned char *) (__const char *) (".dynstr"))[3]); } } __result; })) : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (((o)->name + 0)); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) (".dynstr"))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) (".dynstr"))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) (".dynstr"))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) (".dynstr"))[3]); } } __result; }))) : strcmp (((o)->name + 0), ".dynstr")))); }) != 0)
{
if (! bfd_set_section_contents (abfd, o->output_section,
o->contents,
(file_ptr) o->output_offset,
o->_raw_size))
goto error_return;
}
else
{
off = ((struct bfd_elf_section_data*)o->output_section->used_by_bfd)->this_hdr.sh_offset;
if (bfd_seek (abfd, off, 0) != 0
|| ! _bfd_elf_strtab_emit (abfd,
((struct elf_link_hash_table *) ((info)->hash))->dynstr))
goto error_return;
}
}
}
if (((struct elf_link_hash_table *) ((info)->hash))->stab_info != ((void *)0))
{
if (! _bfd_write_stab_strings (abfd, &((struct elf_link_hash_table *) ((info)->hash))->stab_info))
goto error_return;
}
if (finfo.symstrtab != ((void *)0))
_bfd_stringtab_free (finfo.symstrtab);
if (finfo.contents != ((void *)0))
free (finfo.contents);
if (finfo.external_relocs != ((void *)0))
free (finfo.external_relocs);
if (finfo.internal_relocs != ((void *)0))
free (finfo.internal_relocs);
if (finfo.external_syms != ((void *)0))
free (finfo.external_syms);
if (finfo.internal_syms != ((void *)0))
free (finfo.internal_syms);
if (finfo.indices != ((void *)0))
free (finfo.indices);
if (finfo.sections != ((void *)0))
free (finfo.sections);
if (finfo.symbuf != ((void *)0))
free (finfo.symbuf);
for (o = abfd->sections; o != ((void *)0); o = o->next)
{
if ((o->flags & 0x004) != 0
&& ((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hashes != ((void *)0))
free (((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hashes);
}
((abfd) -> tdata.elf_obj_data)->linker = true;
return true;
error_return:
if (finfo.symstrtab != ((void *)0))
_bfd_stringtab_free (finfo.symstrtab);
if (finfo.contents != ((void *)0))
free (finfo.contents);
if (finfo.external_relocs != ((void *)0))
free (finfo.external_relocs);
if (finfo.internal_relocs != ((void *)0))
free (finfo.internal_relocs);
if (finfo.external_syms != ((void *)0))
free (finfo.external_syms);
if (finfo.internal_syms != ((void *)0))
free (finfo.internal_syms);
if (finfo.indices != ((void *)0))
free (finfo.indices);
if (finfo.sections != ((void *)0))
free (finfo.sections);
if (finfo.symbuf != ((void *)0))
free (finfo.symbuf);
for (o = abfd->sections; o != ((void *)0); o = o->next)
{
if ((o->flags & 0x004) != 0
&& ((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hashes != ((void *)0))
free (((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hashes);
}
return false;
}
static boolean
elf_link_output_sym (finfo, name, elfsym, input_sec)
struct elf_final_link_info *finfo;
const char *name;
Elf_Internal_Sym *elfsym;
asection *input_sec;
{
boolean (*output_symbol_hook) (bfd *, struct bfd_link_info *info, const char *, Elf_Internal_Sym *, asection *);
output_symbol_hook = ((struct elf_backend_data *) (finfo->output_bfd)->xvec->backend_data)->
elf_backend_link_output_symbol_hook;
if (output_symbol_hook != ((void *)0))
{
if (! ((*output_symbol_hook)
(finfo->output_bfd, finfo->info, name, elfsym, input_sec)))
return false;
}
if (name == (const char *) ((void *)0) || *name == '\0')
elfsym->st_name = 0;
else if (input_sec->flags & 0x40000)
elfsym->st_name = 0;
else
{
elfsym->st_name = (unsigned long) _bfd_stringtab_add (finfo->symstrtab,
name, true, false);
if (elfsym->st_name == (unsigned long) -1)
return false;
}
if (finfo->symbuf_count >= finfo->symbuf_size)
{
if (! elf_link_flush_output_syms (finfo))
return false;
}
bfd_elf64_swap_symbol_out (finfo->output_bfd, elfsym,
(void *) (finfo->symbuf + finfo->symbuf_count));
++finfo->symbuf_count;
++ ((finfo->output_bfd)->symcount);
return true;
}
static boolean
elf_link_flush_output_syms (finfo)
struct elf_final_link_info *finfo;
{
if (finfo->symbuf_count > 0)
{
Elf_Internal_Shdr *symtab;
file_ptr pos;
bfd_size_type amt;
symtab = &((finfo->output_bfd) -> tdata.elf_obj_data)->symtab_hdr;
pos = symtab->sh_offset + symtab->sh_size;
amt = finfo->symbuf_count * sizeof (Elf64_External_Sym);
if (bfd_seek (finfo->output_bfd, pos, 0) != 0
|| bfd_bwrite ((void *) finfo->symbuf, amt, finfo->output_bfd) != amt)
return false;
symtab->sh_size += finfo->symbuf_count * sizeof (Elf64_External_Sym);
finfo->symbuf_count = 0;
}
return true;
}
static boolean
elf_link_sec_merge_syms (h, data)
struct elf_link_hash_entry *h;
void * data;
{
asection *sec;
if ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& ((sec = h->root.u.def.section)->flags & 0x20000000)
&& ((struct bfd_elf_section_data*)sec->used_by_bfd)->merge_info)
{
bfd *output_bfd = (bfd *) data;
h->root.u.def.value =
_bfd_merged_section_offset (output_bfd,
&h->root.u.def.section,
((struct bfd_elf_section_data*)sec->used_by_bfd)->merge_info,
h->root.u.def.value, (bfd_vma) 0);
}
return true;
}
# 5863 "elflink.h"
static boolean
elf_link_output_extsym (h, data)
struct elf_link_hash_entry *h;
void * data;
{
struct elf_outext_info *eoinfo = (struct elf_outext_info *) data;
struct elf_final_link_info *finfo = eoinfo->finfo;
boolean strip;
Elf_Internal_Sym sym;
asection *input_sec;
if (eoinfo->localsyms)
{
if ((h->elf_link_hash_flags & 02000) == 0)
return true;
}
else
{
if ((h->elf_link_hash_flags & 02000) != 0)
return true;
}
# 5893 "elflink.h"
if (! finfo->info->relocateable
&& ! finfo->info->allow_shlib_undefined
&& ! finfo->info->shared
&& h->root.type == bfd_link_hash_undefined
&& (h->elf_link_hash_flags & 04) != 0
&& (h->elf_link_hash_flags & 01) == 0)
{
boolean def;
if ((((h->root.u.undef.abfd) -> tdata.elf_obj_data) -> dt_soname) != ((void *)0))
def = elf_link_check_versioned_symbol (finfo->info, h);
else
def = false;
if (!def
&& ! ((*finfo->info->callbacks->undefined_symbol)
(finfo->info, h->root.root.string,
h->root.u.undef.abfd, (asection *) ((void *)0),
(bfd_vma) 0, true)))
{
eoinfo->failed = true;
return false;
}
}
if (h->indx == -2)
strip = false;
else if (((h->elf_link_hash_flags & 010) != 0
|| (h->elf_link_hash_flags & 04) != 0)
&& (h->elf_link_hash_flags & 02) == 0
&& (h->elf_link_hash_flags & 01) == 0)
strip = true;
else if (finfo->info->strip == strip_all
|| (finfo->info->strip == strip_some
&& bfd_hash_lookup (finfo->info->keep_hash,
h->root.root.string,
false, false) == ((void *)0)))
strip = true;
else
strip = false;
if (strip
&& h->dynindx == -1
&& (h->elf_link_hash_flags & 02000) == 0)
return true;
sym.st_value = 0;
sym.st_size = h->size;
sym.st_other = h->other;
if ((h->elf_link_hash_flags & 02000) != 0)
sym.st_info = (((0) << 4) + ((h->type) & 0xF));
else if (h->root.type == bfd_link_hash_undefweak
|| h->root.type == bfd_link_hash_defweak)
sym.st_info = (((2) << 4) + ((h->type) & 0xF));
else
sym.st_info = (((1) << 4) + ((h->type) & 0xF));
switch (h->root.type)
{
default:
case bfd_link_hash_new:
_bfd_abort ("elflink.h", 5964, __PRETTY_FUNCTION__);
return false;
case bfd_link_hash_undefined:
input_sec = ((asection *) &bfd_und_section);
sym.st_shndx = 0;
break;
case bfd_link_hash_undefweak:
input_sec = ((asection *) &bfd_und_section);
sym.st_shndx = 0;
break;
case bfd_link_hash_defined:
case bfd_link_hash_defweak:
{
input_sec = h->root.u.def.section;
if (input_sec->output_section != ((void *)0))
{
sym.st_shndx =
_bfd_elf_section_from_bfd_section (finfo->output_bfd,
input_sec->output_section);
if (sym.st_shndx == (unsigned short) -1)
{
(*_bfd_error_handler)
(dcgettext ("bfd", "%s: could not find output section %s for input section %s", __LC_MESSAGES),
((char *) (finfo->output_bfd)->filename),
input_sec->output_section->name,
input_sec->name);
eoinfo->failed = true;
return false;
}
sym.st_value = h->root.u.def.value + input_sec->output_offset;
if (! finfo->info->relocateable)
sym.st_value += input_sec->output_section->vma;
}
else
{
{ if (!(input_sec->owner == ((void *)0) || (input_sec->owner->flags & 0x40) != 0)) bfd_assert("elflink.h",6007); };
sym.st_shndx = 0;
input_sec = ((asection *) &bfd_und_section);
}
}
break;
case bfd_link_hash_common:
input_sec = h->root.u.c.p->section;
sym.st_shndx = 0xFFF2;
sym.st_value = 1 << h->root.u.c.p->alignment_power;
break;
case bfd_link_hash_indirect:
return true;
case bfd_link_hash_warning:
if (h->root.u.i.link->type == bfd_link_hash_new)
return true;
return (elf_link_output_extsym
((struct elf_link_hash_entry *) h->root.u.i.link, data));
}
if ((h->dynindx != -1
|| (h->elf_link_hash_flags & 02000) != 0)
&& ((struct elf_link_hash_table *) ((finfo->info)->hash))->dynamic_sections_created)
{
struct elf_backend_data *bed;
bed = ((struct elf_backend_data *) (finfo->output_bfd)->xvec->backend_data);
if (! ((*bed->elf_backend_finish_dynamic_symbol)
(finfo->output_bfd, finfo->info, h, &sym)))
{
eoinfo->failed = true;
return false;
}
}
if (sym.st_shndx == 0
&& (h->elf_link_hash_flags & 01) != 0
&& ((((unsigned int)(sym.st_info)) >> 4) == 1
|| (((unsigned int)(sym.st_info)) >> 4) == 2))
{
int bindtype;
if ((h->elf_link_hash_flags & 020) != 0)
bindtype = 1;
else
bindtype = 2;
sym.st_info = (((bindtype) << 4) + ((((sym.st_info) & 0xF)) & 0xF));
}
if (! finfo->info->relocateable
&& (h->elf_link_hash_flags & 02) == 0)
sym.st_other ^= ((sym.st_other) & 0x3);
if (h->dynindx != -1
&& ((struct elf_link_hash_table *) ((finfo->info)->hash))->dynamic_sections_created)
{
size_t bucketcount;
size_t bucket;
size_t hash_entry_size;
bfd_byte *bucketpos;
bfd_vma chain;
Elf64_External_Sym *esym;
sym.st_name = h->dynstr_index;
esym = (Elf64_External_Sym *) finfo->dynsym_sec->contents + h->dynindx;
bfd_elf64_swap_symbol_out (finfo->output_bfd, &sym, (void *) esym);
bucketcount = ((struct elf_link_hash_table *) ((finfo->info)->hash))->bucketcount;
bucket = h->elf_hash_value % bucketcount;
hash_entry_size
= ((struct bfd_elf_section_data*)finfo->hash_sec->used_by_bfd)->this_hdr.sh_entsize;
bucketpos = ((bfd_byte *) finfo->hash_sec->contents
+ (bucket + 2) * hash_entry_size);
chain = ( (8 * hash_entry_size) == 8 ? (bfd_vma) (*(unsigned char *) (bucketpos) & 0xff) : (8 * hash_entry_size) == 16 ? ((*((finfo->output_bfd)->xvec->bfd_getx16)) (bucketpos)) : (8 * hash_entry_size) == 32 ? ((*((finfo->output_bfd)->xvec->bfd_getx32)) (bucketpos)) : (8 * hash_entry_size) == 64 ? ((*((finfo->output_bfd)->xvec->bfd_getx64)) (bucketpos)) : (_bfd_abort ("elflink.h", 6107, __PRETTY_FUNCTION__), (bfd_vma) - 1));
( (8 * hash_entry_size) == 8 ? ((void) (*((unsigned char *) (bucketpos)) = (unsigned char) ((bfd_vma) h->dynindx))) : (8 * hash_entry_size) == 16 ? ((*((finfo->output_bfd)->xvec->bfd_putx16)) (((bfd_vma) h->dynindx),(bucketpos))) : (8 * hash_entry_size) == 32 ? ((*((finfo->output_bfd)->xvec->bfd_putx32)) (((bfd_vma) h->dynindx),(bucketpos))) : (8 * hash_entry_size) == 64 ? ((*((finfo->output_bfd)->xvec->bfd_putx64)) (((bfd_vma) h->dynindx), (bucketpos))) : (_bfd_abort ("elflink.h", 6109, __PRETTY_FUNCTION__), (void) 0));
( (8 * hash_entry_size) == 8 ? ((void) (*((unsigned char *) (((bfd_byte *) finfo->hash_sec->contents + (bucketcount + 2 + h->dynindx) * hash_entry_size))) = (unsigned char) (chain))) : (8 * hash_entry_size) == 16 ? ((*((finfo->output_bfd)->xvec->bfd_putx16)) ((chain),(((bfd_byte *) finfo->hash_sec->contents + (bucketcount + 2 + h->dynindx) * hash_entry_size)))) : (8 * hash_entry_size) == 32 ? ((*((finfo->output_bfd)->xvec->bfd_putx32)) ((chain),(((bfd_byte *) finfo->hash_sec->contents + (bucketcount + 2 + h->dynindx) * hash_entry_size)))) : (8 * hash_entry_size) == 64 ? ((*((finfo->output_bfd)->xvec->bfd_putx64)) ((chain), (((bfd_byte *) finfo->hash_sec->contents + (bucketcount + 2 + h->dynindx) * hash_entry_size)))) : (_bfd_abort ("elflink.h", 6112, __PRETTY_FUNCTION__), (void) 0));
if (finfo->symver_sec != ((void *)0) && finfo->symver_sec->contents != ((void *)0))
{
Elf_Internal_Versym iversym;
Elf_External_Versym *eversym;
if ((h->elf_link_hash_flags & 02) == 0)
{
if (h->verinfo.verdef == ((void *)0))
iversym.vs_vers = 0;
else
iversym.vs_vers = h->verinfo.verdef->vd_exp_refno + 1;
}
else
{
if (h->verinfo.vertree == ((void *)0))
iversym.vs_vers = 1;
else
iversym.vs_vers = h->verinfo.vertree->vernum + 1;
}
if ((h->elf_link_hash_flags & 01000) != 0)
iversym.vs_vers |= 0x8000;
eversym = (Elf_External_Versym *) finfo->symver_sec->contents;
eversym += h->dynindx;
_bfd_elf_swap_versym_out (finfo->output_bfd, &iversym, eversym);
}
}
if (strip)
return true;
h->indx = ((finfo->output_bfd)->symcount);
if (! elf_link_output_sym (finfo, h->root.root.string, &sym, input_sec))
{
eoinfo->failed = true;
return false;
}
return true;
}
static void
elf_link_output_relocs (output_bfd, input_section, input_rel_hdr,
internal_relocs)
bfd *output_bfd;
asection *input_section;
Elf_Internal_Shdr *input_rel_hdr;
Elf_Internal_Rela *internal_relocs;
{
Elf_Internal_Rela *irela;
Elf_Internal_Rela *irelaend;
Elf_Internal_Shdr *output_rel_hdr;
asection *output_section;
unsigned int *rel_countp = ((void *)0);
struct elf_backend_data *bed;
bfd_size_type amt;
output_section = input_section->output_section;
output_rel_hdr = ((void *)0);
if (((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_hdr.sh_entsize
== input_rel_hdr->sh_entsize)
{
output_rel_hdr = &((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_hdr;
rel_countp = &((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_count;
}
else if (((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_hdr2
&& (((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_hdr2->sh_entsize
== input_rel_hdr->sh_entsize))
{
output_rel_hdr = ((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_hdr2;
rel_countp = &((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_count2;
}
{ if (!(output_rel_hdr != ((void *)0))) bfd_assert("elflink.h",6196); };
bed = ((struct elf_backend_data *) (output_bfd)->xvec->backend_data);
irela = internal_relocs;
irelaend = irela + ((input_rel_hdr)->sh_size / (input_rel_hdr)->sh_entsize)
* bed->s->int_rels_per_ext_rel;
if (input_rel_hdr->sh_entsize == sizeof (Elf64_External_Rel))
{
Elf64_External_Rel *erel;
Elf_Internal_Rel *irel;
amt = bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rel);
irel = (Elf_Internal_Rel *) bfd_zmalloc (amt);
if (irel == ((void *)0))
{
(*_bfd_error_handler) (dcgettext ("bfd", "Error: out of memory", __LC_MESSAGES));
_bfd_abort ("elflink.h", 6213, __PRETTY_FUNCTION__);
}
erel = ((Elf64_External_Rel *) output_rel_hdr->contents + *rel_countp);
for (; irela < irelaend; irela += bed->s->int_rels_per_ext_rel, erel++)
{
unsigned int i;
for (i = 0; i < bed->s->int_rels_per_ext_rel; i++)
{
irel[i].r_offset = irela[i].r_offset;
irel[i].r_info = irela[i].r_info;
{ if (!(irela[i].r_addend == 0)) bfd_assert("elflink.h",6225); };
}
if (bed->s->swap_reloc_out)
(*bed->s->swap_reloc_out) (output_bfd, irel, (void *) erel);
else
bfd_elf64_swap_reloc_out (output_bfd, irel, erel);
}
free (irel);
}
else
{
Elf64_External_Rela *erela;
{ if (!(input_rel_hdr->sh_entsize == sizeof (Elf64_External_Rela))) bfd_assert("elflink.h",6240); };
erela = ((Elf64_External_Rela *) output_rel_hdr->contents + *rel_countp);
for (; irela < irelaend; irela += bed->s->int_rels_per_ext_rel, erela++)
if (bed->s->swap_reloca_out)
(*bed->s->swap_reloca_out) (output_bfd, irela, (void *) erela);
else
bfd_elf64_swap_reloca_out (output_bfd, irela, erela);
}
*rel_countp += ((input_rel_hdr)->sh_size / (input_rel_hdr)->sh_entsize);
}
static boolean
elf_link_input_bfd (finfo, input_bfd)
struct elf_final_link_info *finfo;
bfd *input_bfd;
{
boolean (*relocate_section) (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
bfd *output_bfd;
Elf_Internal_Shdr *symtab_hdr;
size_t locsymcount;
size_t extsymoff;
Elf64_External_Sym *external_syms;
Elf64_External_Sym *esym;
Elf64_External_Sym *esymend;
Elf_Internal_Sym *isym;
long *pindex;
asection **ppsection;
asection *o;
struct elf_backend_data *bed;
boolean emit_relocs;
struct elf_link_hash_entry **sym_hashes;
output_bfd = finfo->output_bfd;
bed = ((struct elf_backend_data *) (output_bfd)->xvec->backend_data);
relocate_section = bed->elf_backend_relocate_section;
if ((input_bfd->flags & 0x40) != 0)
return true;
emit_relocs = (finfo->info->relocateable
|| finfo->info->emitrelocations
|| bed->elf_backend_emit_relocs);
symtab_hdr = &((input_bfd) -> tdata.elf_obj_data)->symtab_hdr;
if ((((input_bfd) -> tdata.elf_obj_data) -> bad_symtab))
{
locsymcount = symtab_hdr->sh_size / sizeof (Elf64_External_Sym);
extsymoff = 0;
}
else
{
locsymcount = symtab_hdr->sh_info;
extsymoff = symtab_hdr->sh_info;
}
if (symtab_hdr->contents != ((void *)0))
external_syms = (Elf64_External_Sym *) symtab_hdr->contents;
else if (locsymcount == 0)
external_syms = ((void *)0);
else
{
bfd_size_type amt = locsymcount * sizeof (Elf64_External_Sym);
external_syms = finfo->external_syms;
if (bfd_seek (input_bfd, symtab_hdr->sh_offset, 0) != 0
|| bfd_bread (external_syms, amt, input_bfd) != amt)
return false;
}
esym = external_syms;
esymend = esym + locsymcount;
isym = finfo->internal_syms;
pindex = finfo->indices;
ppsection = finfo->sections;
for (; esym < esymend; esym++, isym++, pindex++, ppsection++)
{
asection *isec;
const char *name;
Elf_Internal_Sym osym;
bfd_elf64_swap_symbol_in (input_bfd, esym, isym);
*pindex = -1;
if ((((input_bfd) -> tdata.elf_obj_data) -> bad_symtab))
{
if ((((unsigned int)(isym->st_info)) >> 4) != 0)
{
*ppsection = ((void *)0);
continue;
}
}
if (isym->st_shndx == 0)
isec = ((asection *) &bfd_und_section);
else if (isym->st_shndx > 0 && isym->st_shndx < 0xFF00)
{
isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
if (isec && ((struct bfd_elf_section_data*)isec->used_by_bfd)->merge_info
&& ((isym->st_info) & 0xF) != 3)
isym->st_value =
_bfd_merged_section_offset (output_bfd, &isec,
((struct bfd_elf_section_data*)isec->used_by_bfd)->merge_info,
isym->st_value, (bfd_vma) 0);
}
else if (isym->st_shndx == 0xFFF1)
isec = ((asection *) &bfd_abs_section);
else if (isym->st_shndx == 0xFFF2)
isec = ((asection *) &bfd_com_section);
else
{
isec = ((void *)0);
}
*ppsection = isec;
if (esym == external_syms)
continue;
if (((isym->st_info) & 0xF) == 3)
{
continue;
}
if (finfo->info->strip == strip_all)
continue;
if (finfo->info->discard == discard_all)
continue;
if (isym->st_shndx > 0
&& isym->st_shndx < 0xFF00
&& isec != ((void *)0)
&& ((! isec->linker_mark && (isec->flags & 0x200) != 0)
|| (! finfo->info->relocateable
&& (isec->flags & 0x40000) != 0)))
continue;
name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link,
isym->st_name);
if (name == ((void *)0))
return false;
if ((finfo->info->strip == strip_some
&& (bfd_hash_lookup (finfo->info->keep_hash, name, false, false)
== ((void *)0)))
|| (((finfo->info->discard == discard_sec_merge
&& (isec->flags & 0x20000000) && ! finfo->info->relocateable)
|| finfo->info->discard == discard_l)
&& ((*((input_bfd)->xvec->_bfd_is_local_label_name)) (input_bfd, name))))
continue;
osym = *isym;
osym.st_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
isec->output_section);
if (osym.st_shndx == (unsigned short) -1)
return false;
*pindex = ((output_bfd)->symcount);
# 6446 "elflink.h"
osym.st_value += isec->output_offset;
if (! finfo->info->relocateable)
osym.st_value += isec->output_section->vma;
if (! elf_link_output_sym (finfo, name, &osym, isec))
return false;
}
sym_hashes = (((input_bfd) -> tdata.elf_obj_data) -> sym_hashes);
for (o = input_bfd->sections; o != ((void *)0); o = o->next)
{
bfd_byte *contents;
if (! o->linker_mark)
{
continue;
}
if ((o->flags & 0x200) == 0
|| (o->_raw_size == 0 && (o->flags & 0x004) == 0))
continue;
if ((o->flags & 0x800000) != 0)
{
continue;
}
if (((struct bfd_elf_section_data*)o->used_by_bfd)->this_hdr.contents != ((void *)0))
contents = ((struct bfd_elf_section_data*)o->used_by_bfd)->this_hdr.contents;
else
{
contents = finfo->contents;
if (! bfd_get_section_contents (input_bfd, o, contents,
(file_ptr) 0, o->_raw_size))
return false;
}
if ((o->flags & 0x004) != 0)
{
Elf_Internal_Rela *internal_relocs;
internal_relocs = (_bfd_elf64_link_read_relocs
(input_bfd, o, finfo->external_relocs,
finfo->internal_relocs, false));
if (internal_relocs == ((void *)0)
&& o->reloc_count > 0)
return false;
# 6513 "elflink.h"
if (!finfo->info->relocateable
&& !elf_section_ignore_discarded_relocs (o))
{
Elf_Internal_Rela *rel, *relend;
rel = internal_relocs;
relend = rel + o->reloc_count * bed->s->int_rels_per_ext_rel;
for ( ; rel < relend; rel++)
{
unsigned long r_symndx = ((rel->r_info) >> 32);
if (r_symndx >= locsymcount
|| ((((input_bfd) -> tdata.elf_obj_data) -> bad_symtab)
&& finfo->sections[r_symndx] == ((void *)0)))
{
struct elf_link_hash_entry *h;
h = sym_hashes[r_symndx - extsymoff];
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;
if ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& ! ((h->root.u.def.section) == ((asection *) &bfd_abs_section))
&& ((h->root.u.def.section ->output_section) == ((asection *) &bfd_abs_section)))
{
if ((o->flags & 0x10000) != 0)
{
{ if (!(r_symndx != 0)) bfd_assert("elflink.h",6552); };
(__extension__ (__builtin_constant_p (0) && (0) == '\0' ? ({ void *__s = (rel); __builtin_memset (__s, '\0', sizeof (*rel)); __s; }) : memset (rel, 0, sizeof (*rel))));
}
else
{
if (! ((*finfo->info->callbacks->undefined_symbol)
(finfo->info, h->root.root.string,
input_bfd, o, rel->r_offset,
true)))
return false;
}
}
}
else
{
asection *sec = finfo->sections[r_symndx];
if (sec != ((void *)0)
&& ! ((sec) == ((asection *) &bfd_abs_section))
&& ((sec->output_section) == ((asection *) &bfd_abs_section)))
{
if ((o->flags & 0x10000) != 0
|| (sec->flags & 0x100000) != 0)
{
{ if (!(r_symndx != 0)) bfd_assert("elflink.h",6584); };
rel->r_info
= (((bfd_vma) (0) << 32) + (bfd_vma) (((rel->r_info) & 0xffffffff)));
rel->r_addend = 0;
}
else
{
boolean ok;
const char *msg
= dcgettext ("bfd", "local symbols in discarded section %s", __LC_MESSAGES);
bfd_size_type amt
= strlen (sec->name) + strlen (msg) - 1;
char *buf = (char *) bfd_malloc (amt);
if (buf != ((void *)0))
sprintf (buf, msg, sec->name);
else
buf = (char *) sec->name;
ok = (*finfo->info->callbacks
->undefined_symbol) (finfo->info, buf,
input_bfd, o,
rel->r_offset,
true);
if (buf != sec->name)
free (buf);
if (!ok)
return false;
}
}
}
}
}
# 6638 "elflink.h"
if (! (*relocate_section) (output_bfd, finfo->info,
input_bfd, o, contents,
internal_relocs,
finfo->internal_syms,
finfo->sections))
return false;
if (emit_relocs)
{
Elf_Internal_Rela *irela;
Elf_Internal_Rela *irelaend;
struct elf_link_hash_entry **rel_hash;
Elf_Internal_Shdr *input_rel_hdr;
unsigned int next_erel;
void (*reloc_emitter) (bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *);
irela = internal_relocs;
irelaend = irela + o->reloc_count * bed->s->int_rels_per_ext_rel;
rel_hash = (((struct bfd_elf_section_data*)o->output_section->used_by_bfd)->rel_hashes
+ ((struct bfd_elf_section_data*)o->output_section->used_by_bfd)->rel_count
+ ((struct bfd_elf_section_data*)o->output_section->used_by_bfd)->rel_count2);
for (next_erel = 0; irela < irelaend; irela++, next_erel++)
{
unsigned long r_symndx;
asection *sec;
if (next_erel == bed->s->int_rels_per_ext_rel)
{
rel_hash++;
next_erel = 0;
}
irela->r_offset += o->output_offset;
if (finfo->info->emitrelocations)
irela->r_offset += o->output_section->vma;
r_symndx = ((irela->r_info) >> 32);
if (r_symndx == 0)
continue;
if (r_symndx >= locsymcount
|| ((((input_bfd) -> tdata.elf_obj_data) -> bad_symtab)
&& finfo->sections[r_symndx] == ((void *)0)))
{
struct elf_link_hash_entry *rh;
unsigned long indx;
# 6699 "elflink.h"
indx = r_symndx - extsymoff;
rh = (((input_bfd) -> tdata.elf_obj_data) -> sym_hashes)[indx];
while (rh->root.type == bfd_link_hash_indirect
|| rh->root.type == bfd_link_hash_warning)
rh = (struct elf_link_hash_entry *) rh->root.u.i.link;
{ if (!(rh->indx < 0)) bfd_assert("elflink.h",6708); };
rh->indx = -2;
*rel_hash = rh;
continue;
}
*rel_hash = ((void *)0);
isym = finfo->internal_syms + r_symndx;
sec = finfo->sections[r_symndx];
if (((isym->st_info) & 0xF) == 3)
{
if (sec != ((void *)0)
&& (((sec) == ((asection *) &bfd_abs_section))
|| (sec->output_section != ((void *)0)
&& ((sec->output_section) == ((asection *) &bfd_abs_section)))))
r_symndx = 0;
else if (sec == ((void *)0) || sec->owner == ((void *)0))
{
bfd_set_error (bfd_error_bad_value);
return false;
}
else
{
r_symndx = sec->output_section->target_index;
{ if (!(r_symndx != 0)) bfd_assert("elflink.h",6741); };
}
}
else
{
if (finfo->indices[r_symndx] == -1)
{
unsigned long shlink;
const char *name;
asection *osec;
if (finfo->info->strip == strip_all)
{
bfd_set_error (bfd_error_invalid_operation);
return false;
}
shlink = symtab_hdr->sh_link;
name = (bfd_elf_string_from_elf_section
(input_bfd, shlink, isym->st_name));
if (name == ((void *)0))
return false;
osec = sec->output_section;
isym->st_shndx =
_bfd_elf_section_from_bfd_section (output_bfd,
osec);
if (isym->st_shndx == (unsigned short) -1)
return false;
isym->st_value += sec->output_offset;
if (! finfo->info->relocateable)
isym->st_value += osec->vma;
finfo->indices[r_symndx]
= ((output_bfd)->symcount);
if (! elf_link_output_sym (finfo, name, isym, sec))
return false;
}
r_symndx = finfo->indices[r_symndx];
}
irela->r_info = (((bfd_vma) (r_symndx) << 32) + (bfd_vma) (((irela->r_info) & 0xffffffff)));
}
if (bed->elf_backend_emit_relocs
&& !(finfo->info->relocateable
|| finfo->info->emitrelocations))
reloc_emitter = bed->elf_backend_emit_relocs;
else
reloc_emitter = elf_link_output_relocs;
input_rel_hdr = &((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr;
(*reloc_emitter) (output_bfd, o, input_rel_hdr, internal_relocs);
input_rel_hdr = ((struct bfd_elf_section_data*)o->used_by_bfd)->rel_hdr2;
if (input_rel_hdr)
{
internal_relocs += (((input_rel_hdr)->sh_size / (input_rel_hdr)->sh_entsize)
* bed->s->int_rels_per_ext_rel);
reloc_emitter (output_bfd, o, input_rel_hdr, internal_relocs);
}
}
}
if (bed->elf_backend_write_section
&& (*bed->elf_backend_write_section) (output_bfd, o, contents))
{
}
else if (((struct bfd_elf_section_data*)o->used_by_bfd)->stab_info)
{
if (! (_bfd_write_section_stabs
(output_bfd, &((struct elf_link_hash_table *) ((finfo->info)->hash))->stab_info,
o, &((struct bfd_elf_section_data*)o->used_by_bfd)->stab_info, contents)))
return false;
}
else if (((struct bfd_elf_section_data*)o->used_by_bfd)->merge_info)
{
if (! (_bfd_write_merged_section
(output_bfd, o, ((struct bfd_elf_section_data*)o->used_by_bfd)->merge_info)))
return false;
}
else
{
bfd_size_type sec_size;
sec_size = (o->_cooked_size != 0 ? o->_cooked_size : o->_raw_size);
if (! (o->flags & 0x40000)
&& ! bfd_set_section_contents (output_bfd, o->output_section,
contents,
(file_ptr) o->output_offset,
sec_size))
return false;
}
}
return true;
}
static boolean
elf_reloc_link_order (output_bfd, info, output_section, link_order)
bfd *output_bfd;
struct bfd_link_info *info;
asection *output_section;
struct bfd_link_order *link_order;
{
reloc_howto_type *howto;
long indx;
bfd_vma offset;
bfd_vma addend;
struct elf_link_hash_entry **rel_hash_ptr;
Elf_Internal_Shdr *rel_hdr;
struct elf_backend_data *bed = ((struct elf_backend_data *) (output_bfd)->xvec->backend_data);
howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
if (howto == ((void *)0))
{
bfd_set_error (bfd_error_bad_value);
return false;
}
addend = link_order->u.reloc.p->addend;
rel_hash_ptr = (((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_hashes
+ ((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_count
+ ((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_count2);
if (link_order->type == bfd_section_reloc_link_order)
{
indx = link_order->u.reloc.p->u.section->target_index;
{ if (!(indx != 0)) bfd_assert("elflink.h",6887); };
*rel_hash_ptr = ((void *)0);
}
else
{
struct elf_link_hash_entry *h;
h = ((struct elf_link_hash_entry *)
bfd_wrapped_link_hash_lookup (output_bfd, info,
link_order->u.reloc.p->u.name,
false, false, true));
if (h != ((void *)0)
&& (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak))
{
asection *section;
section = h->root.u.def.section;
indx = section->output_section->target_index;
*rel_hash_ptr = ((void *)0);
addend += section->output_section->vma + section->output_offset;
}
else if (h != ((void *)0))
{
h->indx = -2;
*rel_hash_ptr = h;
indx = 0;
}
else
{
if (! ((*info->callbacks->unattached_reloc)
(info, link_order->u.reloc.p->u.name, (bfd *) ((void *)0),
(asection *) ((void *)0), (bfd_vma) 0)))
return false;
indx = 0;
}
}
if (howto->partial_inplace && addend != 0)
{
bfd_size_type size;
bfd_reloc_status_type rstat;
bfd_byte *buf;
boolean ok;
const char *sym_name;
size = bfd_get_reloc_size (howto);
buf = (bfd_byte *) bfd_zmalloc (size);
if (buf == (bfd_byte *) ((void *)0))
return false;
rstat = _bfd_relocate_contents (howto, output_bfd, (bfd_vma) addend, buf);
switch (rstat)
{
case bfd_reloc_ok:
break;
default:
case bfd_reloc_outofrange:
_bfd_abort ("elflink.h", 6954, __PRETTY_FUNCTION__);
case bfd_reloc_overflow:
if (link_order->type == bfd_section_reloc_link_order)
sym_name = ((link_order->u.reloc.p->u.section)->name);
else
sym_name = link_order->u.reloc.p->u.name;
if (! ((*info->callbacks->reloc_overflow)
(info, sym_name, howto->name, addend,
(bfd *) ((void *)0), (asection *) ((void *)0), (bfd_vma) 0)))
{
free (buf);
return false;
}
break;
}
ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf,
(file_ptr) link_order->offset, size);
free (buf);
if (! ok)
return false;
}
offset = link_order->offset;
if (! info->relocateable)
offset += output_section->vma;
rel_hdr = &((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_hdr;
if (rel_hdr->sh_type == 9)
{
bfd_size_type size;
Elf_Internal_Rel *irel;
Elf64_External_Rel *erel;
unsigned int i;
size = bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rel);
irel = (Elf_Internal_Rel *) bfd_zmalloc (size);
if (irel == ((void *)0))
return false;
for (i = 0; i < bed->s->int_rels_per_ext_rel; i++)
irel[i].r_offset = offset;
irel[0].r_info = (((bfd_vma) (indx) << 32) + (bfd_vma) (howto->type));
erel = ((Elf64_External_Rel *) rel_hdr->contents
+ ((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_count);
if (bed->s->swap_reloc_out)
(*bed->s->swap_reloc_out) (output_bfd, irel, (bfd_byte *) erel);
else
bfd_elf64_swap_reloc_out (output_bfd, irel, erel);
free (irel);
}
else
{
bfd_size_type size;
Elf_Internal_Rela *irela;
Elf64_External_Rela *erela;
unsigned int i;
size = bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela);
irela = (Elf_Internal_Rela *) bfd_zmalloc (size);
if (irela == ((void *)0))
return false;
for (i = 0; i < bed->s->int_rels_per_ext_rel; i++)
irela[i].r_offset = offset;
irela[0].r_info = (((bfd_vma) (indx) << 32) + (bfd_vma) (howto->type));
irela[0].r_addend = addend;
erela = ((Elf64_External_Rela *) rel_hdr->contents
+ ((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_count);
if (bed->s->swap_reloca_out)
(*bed->s->swap_reloca_out) (output_bfd, irela, (bfd_byte *) erela);
else
bfd_elf64_swap_reloca_out (output_bfd, irela, erela);
}
++((struct bfd_elf_section_data*)output_section->used_by_bfd)->rel_count;
return true;
}
boolean
bfd_elf64_create_pointer_linker_section (abfd, info, lsect, h, rel)
bfd *abfd;
struct bfd_link_info *info;
elf_linker_section_t *lsect;
struct elf_link_hash_entry *h;
const Elf_Internal_Rela *rel;
{
elf_linker_section_pointers_t **ptr_linker_section_ptr = ((void *)0);
elf_linker_section_pointers_t *linker_section_ptr;
unsigned long r_symndx = ((rel->r_info) >> 32);
bfd_size_type amt;
{ if (!(lsect != ((void *)0))) bfd_assert("elflink.h",7059); };
if (h != ((void *)0))
{
if (_bfd_elf_find_pointer_linker_section (h->linker_section_pointer,
rel->r_addend,
lsect->which))
return true;
ptr_linker_section_ptr = &h->linker_section_pointer;
if (h->dynindx == -1)
{
if (! _bfd_elf_link_record_dynamic_symbol (info, h))
return false;
}
if (lsect->rel_section)
lsect->rel_section->_raw_size += sizeof (Elf64_External_Rela);
}
else
{
elf_linker_section_pointers_t **ptr = (((abfd) -> tdata.elf_obj_data) -> linker_section_pointers);
if (!ptr)
{
unsigned int num_symbols = ((abfd) -> tdata.elf_obj_data)->symtab_hdr.sh_info;
register unsigned int i;
amt = num_symbols;
amt *= sizeof (elf_linker_section_pointers_t *);
ptr = (elf_linker_section_pointers_t **) bfd_alloc (abfd, amt);
if (!ptr)
return false;
(((abfd) -> tdata.elf_obj_data) -> linker_section_pointers) = ptr;
for (i = 0; i < num_symbols; i++)
ptr[i] = (elf_linker_section_pointers_t *) 0;
}
if (_bfd_elf_find_pointer_linker_section (ptr[r_symndx],
rel->r_addend,
lsect->which))
return true;
ptr_linker_section_ptr = &ptr[r_symndx];
if (info->shared)
{
{ if (!(lsect->rel_section != ((void *)0))) bfd_assert("elflink.h",7117); };
lsect->rel_section->_raw_size += sizeof (Elf64_External_Rela);
}
}
{ if (!(ptr_linker_section_ptr != ((void *)0))) bfd_assert("elflink.h",7124); };
amt = sizeof (elf_linker_section_pointers_t);
linker_section_ptr = (elf_linker_section_pointers_t *) bfd_alloc (abfd, amt);
if (!linker_section_ptr)
return false;
linker_section_ptr->next = *ptr_linker_section_ptr;
linker_section_ptr->addend = rel->r_addend;
linker_section_ptr->which = lsect->which;
linker_section_ptr->written_address_p = false;
*ptr_linker_section_ptr = linker_section_ptr;
# 7158 "elflink.h"
linker_section_ptr->offset = lsect->section->_raw_size;
lsect->section->_raw_size += 64 / 8;
# 7169 "elflink.h"
return true;
}
# 7181 "elflink.h"
bfd_vma
bfd_elf64_finish_pointer_linker_section (output_bfd, input_bfd, info, lsect, h,
relocation, rel, relative_reloc)
bfd *output_bfd;
bfd *input_bfd;
struct bfd_link_info *info;
elf_linker_section_t *lsect;
struct elf_link_hash_entry *h;
bfd_vma relocation;
const Elf_Internal_Rela *rel;
int relative_reloc;
{
elf_linker_section_pointers_t *linker_section_ptr;
{ if (!(lsect != ((void *)0))) bfd_assert("elflink.h",7195); };
if (h != ((void *)0))
{
linker_section_ptr = (_bfd_elf_find_pointer_linker_section
(h->linker_section_pointer,
rel->r_addend,
lsect->which));
{ if (!(linker_section_ptr != ((void *)0))) bfd_assert("elflink.h",7205); };
if (! ((struct elf_link_hash_table *) ((info)->hash))->dynamic_sections_created
|| (info->shared
&& info->symbolic
&& (h->elf_link_hash_flags & 02)))
{
# 7220 "elflink.h"
if (!linker_section_ptr->written_address_p)
{
linker_section_ptr->written_address_p = true;
((*((output_bfd)->xvec->bfd_putx64)) ((relocation + linker_section_ptr->addend), ((lsect->section->contents + linker_section_ptr->offset))));
}
}
}
else
{
unsigned long r_symndx = ((rel->r_info) >> 32);
{ if (!((((input_bfd) -> tdata.elf_obj_data) -> linker_section_pointers) != ((void *)0))) bfd_assert("elflink.h",7234); };
{ if (!((((input_bfd) -> tdata.elf_obj_data) -> linker_section_pointers)[r_symndx] != ((void *)0))) bfd_assert("elflink.h",7235); };
linker_section_ptr = (_bfd_elf_find_pointer_linker_section
((((input_bfd) -> tdata.elf_obj_data) -> linker_section_pointers)[r_symndx],
rel->r_addend,
lsect->which));
{ if (!(linker_section_ptr != ((void *)0))) bfd_assert("elflink.h",7241); };
if (!linker_section_ptr->written_address_p)
{
linker_section_ptr->written_address_p = true;
((*((output_bfd)->xvec->bfd_putx64)) ((relocation + linker_section_ptr->addend), (lsect->section->contents + linker_section_ptr->offset)));
if (info->shared)
{
asection *srel = lsect->rel_section;
Elf_Internal_Rela *outrel;
Elf64_External_Rela *erel;
struct elf_backend_data *bed = ((struct elf_backend_data *) (output_bfd)->xvec->backend_data);
unsigned int i;
bfd_size_type amt;
amt = sizeof (Elf_Internal_Rela) * bed->s->int_rels_per_ext_rel;
outrel = (Elf_Internal_Rela *) bfd_zmalloc (amt);
if (outrel == ((void *)0))
{
(*_bfd_error_handler) (dcgettext ("bfd", "Error: out of memory", __LC_MESSAGES));
return 0;
}
if (!srel)
{
srel = bfd_get_section_by_name (((struct elf_link_hash_table *) ((info)->hash))->dynobj,
lsect->rel_name);
lsect->rel_section = srel;
}
{ if (!(srel != ((void *)0))) bfd_assert("elflink.h",7276); };
for (i = 0; i < bed->s->int_rels_per_ext_rel; i++)
outrel[i].r_offset = (lsect->section->output_section->vma
+ lsect->section->output_offset
+ linker_section_ptr->offset);
outrel[0].r_info = (((bfd_vma) (0) << 32) + (bfd_vma) (relative_reloc));
outrel[0].r_addend = 0;
erel = (Elf64_External_Rela *) lsect->section->contents;
erel += ((struct bfd_elf_section_data*)lsect->section->used_by_bfd)->rel_count;
bfd_elf64_swap_reloca_out (output_bfd, outrel, erel);
++((struct bfd_elf_section_data*)lsect->section->used_by_bfd)->rel_count;
free (outrel);
}
}
}
relocation = (lsect->section->output_offset
+ linker_section_ptr->offset
- lsect->hole_offset
- lsect->sym_offset);
# 7307 "elflink.h"
return relocation - linker_section_ptr->addend;
}
static boolean elf_gc_mark
(struct bfd_link_info *info, asection *sec, asection * (*gc_mark_hook) (bfd *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *, Elf_Internal_Sym *));
static boolean elf_gc_sweep
(struct bfd_link_info *info, boolean (*gc_sweep_hook) (bfd *abfd, struct bfd_link_info *info, asection *o, const Elf_Internal_Rela *relocs));
static boolean elf_gc_sweep_symbol
(struct elf_link_hash_entry *h, void * idxptr);
static boolean elf_gc_allocate_got_offsets
(struct elf_link_hash_entry *h, void * offarg);
static boolean elf_gc_propagate_vtable_entries_used
(struct elf_link_hash_entry *h, void * dummy);
static boolean elf_gc_smash_unused_vtentry_relocs
(struct elf_link_hash_entry *h, void * dummy);
static boolean
elf_gc_mark (info, sec, gc_mark_hook)
struct bfd_link_info *info;
asection *sec;
asection * (*gc_mark_hook)
(bfd *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *, Elf_Internal_Sym *);
{
boolean ret;
asection *group_sec;
sec->gc_mark = 1;
group_sec = ((struct bfd_elf_section_data*)sec->used_by_bfd)->next_in_group;
if (group_sec && !group_sec->gc_mark)
if (!elf_gc_mark (info, group_sec, gc_mark_hook))
return false;
ret = true;
if ((sec->flags & 0x004) != 0 && sec->reloc_count > 0)
{
Elf_Internal_Rela *relstart, *rel, *relend;
Elf_Internal_Shdr *symtab_hdr;
struct elf_link_hash_entry **sym_hashes;
size_t nlocsyms;
size_t extsymoff;
Elf64_External_Sym *locsyms, *freesyms = ((void *)0);
bfd *input_bfd = sec->owner;
struct elf_backend_data *bed = ((struct elf_backend_data *) (input_bfd)->xvec->backend_data);
symtab_hdr = &((input_bfd) -> tdata.elf_obj_data)->symtab_hdr;
sym_hashes = (((input_bfd) -> tdata.elf_obj_data) -> sym_hashes);
if ((((input_bfd) -> tdata.elf_obj_data) -> bad_symtab))
{
nlocsyms = symtab_hdr->sh_size / sizeof (Elf64_External_Sym);
extsymoff = 0;
}
else
extsymoff = nlocsyms = symtab_hdr->sh_info;
if (symtab_hdr->contents)
locsyms = (Elf64_External_Sym *) symtab_hdr->contents;
else if (nlocsyms == 0)
locsyms = ((void *)0);
else
{
bfd_size_type amt = nlocsyms * sizeof (Elf64_External_Sym);
locsyms = freesyms = bfd_malloc (amt);
if (freesyms == ((void *)0)
|| bfd_seek (input_bfd, symtab_hdr->sh_offset, 0) != 0
|| bfd_bread (locsyms, amt, input_bfd) != amt)
{
ret = false;
goto out1;
}
}
relstart = (_bfd_elf64_link_read_relocs
(sec->owner, sec, ((void *)0), (Elf_Internal_Rela *) ((void *)0),
info->keep_memory));
if (relstart == ((void *)0))
{
ret = false;
goto out1;
}
relend = relstart + sec->reloc_count * bed->s->int_rels_per_ext_rel;
for (rel = relstart; rel < relend; rel++)
{
unsigned long r_symndx;
asection *rsec;
struct elf_link_hash_entry *h;
Elf_Internal_Sym s;
r_symndx = ((rel->r_info) >> 32);
if (r_symndx == 0)
continue;
if ((((sec->owner) -> tdata.elf_obj_data) -> bad_symtab))
{
bfd_elf64_swap_symbol_in (input_bfd, &locsyms[r_symndx], &s);
if ((((unsigned int)(s.st_info)) >> 4) == 0)
rsec = (*gc_mark_hook) (sec->owner, info, rel, ((void *)0), &s);
else
{
h = sym_hashes[r_symndx - extsymoff];
rsec = (*gc_mark_hook) (sec->owner, info, rel, h, ((void *)0));
}
}
else if (r_symndx >= nlocsyms)
{
h = sym_hashes[r_symndx - extsymoff];
rsec = (*gc_mark_hook) (sec->owner, info, rel, h, ((void *)0));
}
else
{
bfd_elf64_swap_symbol_in (input_bfd, &locsyms[r_symndx], &s);
rsec = (*gc_mark_hook) (sec->owner, info, rel, ((void *)0), &s);
}
if (rsec && !rsec->gc_mark)
if (!elf_gc_mark (info, rsec, gc_mark_hook))
{
ret = false;
goto out2;
}
}
out2:
if (!info->keep_memory)
free (relstart);
out1:
if (freesyms)
free (freesyms);
}
return ret;
}
static boolean
elf_gc_sweep (info, gc_sweep_hook)
struct bfd_link_info *info;
boolean (*gc_sweep_hook)
(bfd *abfd, struct bfd_link_info *info, asection *o, const Elf_Internal_Rela *relocs);
{
bfd *sub;
for (sub = info->input_bfds; sub != ((void *)0); sub = sub->link_next)
{
asection *o;
if (((sub)->xvec->flavour) != bfd_target_elf_flavour)
continue;
for (o = sub->sections; o != ((void *)0); o = o->next)
{
if ((o->flags & 0x800000)
|| (o->flags & 0x10000))
o->gc_mark = 1;
if (o->gc_mark)
continue;
if (o->flags & 0x40000)
continue;
o->flags |= 0x40000;
if (gc_sweep_hook
&& (o->flags & 0x004) && o->reloc_count > 0)
{
Elf_Internal_Rela *internal_relocs;
boolean r;
internal_relocs = (_bfd_elf64_link_read_relocs
(o->owner, o, ((void *)0), ((void *)0), info->keep_memory));
if (internal_relocs == ((void *)0))
return false;
r = (*gc_sweep_hook) (o->owner, info, o, internal_relocs);
if (!info->keep_memory)
free (internal_relocs);
if (!r)
return false;
}
}
}
{
int i = 0;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_gc_sweep_symbol), ((void *) &i)));
((struct elf_link_hash_table *) ((info)->hash))->dynsymcount = i;
}
return true;
}
static boolean
elf_gc_sweep_symbol (h, idxptr)
struct elf_link_hash_entry *h;
void * idxptr;
{
int *idx = (int *) idxptr;
if (h->dynindx != -1
&& ((h->root.type != bfd_link_hash_defined
&& h->root.type != bfd_link_hash_defweak)
|| h->root.u.def.section->gc_mark))
h->dynindx = (*idx)++;
return true;
}
static boolean
elf_gc_propagate_vtable_entries_used (h, okp)
struct elf_link_hash_entry *h;
void * okp;
{
if (h->vtable_parent == ((void *)0))
return true;
if (h->vtable_parent == (struct elf_link_hash_entry *) -1)
return true;
if (h->vtable_entries_used && h->vtable_entries_used[-1])
return true;
elf_gc_propagate_vtable_entries_used (h->vtable_parent, okp);
if (h->vtable_entries_used == ((void *)0))
{
h->vtable_entries_used = h->vtable_parent->vtable_entries_used;
h->vtable_entries_size = h->vtable_parent->vtable_entries_size;
}
else
{
size_t n;
boolean *cu, *pu;
cu = h->vtable_entries_used;
cu[-1] = true;
pu = h->vtable_parent->vtable_entries_used;
if (pu != ((void *)0))
{
asection *sec = h->root.u.def.section;
struct elf_backend_data *bed = ((struct elf_backend_data *) (sec->owner)->xvec->backend_data);
int file_align = bed->s->file_align;
n = h->vtable_parent->vtable_entries_size / file_align;
while (n--)
{
if (*pu)
*cu = true;
pu++;
cu++;
}
}
}
return true;
}
static boolean
elf_gc_smash_unused_vtentry_relocs (h, okp)
struct elf_link_hash_entry *h;
void * okp;
{
asection *sec;
bfd_vma hstart, hend;
Elf_Internal_Rela *relstart, *relend, *rel;
struct elf_backend_data *bed;
int file_align;
if (h->vtable_parent == ((void *)0))
return true;
{ if (!(h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak)) bfd_assert("elflink.h",7636); };
sec = h->root.u.def.section;
hstart = h->root.u.def.value;
hend = hstart + h->size;
relstart = (_bfd_elf64_link_read_relocs
(sec->owner, sec, ((void *)0), (Elf_Internal_Rela *) ((void *)0), true));
if (!relstart)
return *(boolean *) okp = false;
bed = ((struct elf_backend_data *) (sec->owner)->xvec->backend_data);
file_align = bed->s->file_align;
relend = relstart + sec->reloc_count * bed->s->int_rels_per_ext_rel;
for (rel = relstart; rel < relend; ++rel)
if (rel->r_offset >= hstart && rel->r_offset < hend)
{
if (h->vtable_entries_used
&& (rel->r_offset - hstart) < h->vtable_entries_size)
{
bfd_vma entry = (rel->r_offset - hstart) / file_align;
if (h->vtable_entries_used[entry])
continue;
}
rel->r_offset = rel->r_info = rel->r_addend = 0;
}
return true;
}
boolean
_bfd_elf64_gc_sections (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
boolean ok = true;
bfd *sub;
asection * (*gc_mark_hook)
(bfd *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *h, Elf_Internal_Sym *);
if (!((struct elf_backend_data *) (abfd)->xvec->backend_data)->can_gc_sections
|| info->relocateable || info->emitrelocations
|| ((struct elf_link_hash_table *) ((info)->hash))->dynamic_sections_created)
return true;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_gc_propagate_vtable_entries_used), ((void *) &ok)));
if (!ok)
return false;
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_gc_smash_unused_vtentry_relocs), ((void *) &ok)));
if (!ok)
return false;
gc_mark_hook = ((struct elf_backend_data *) (abfd)->xvec->backend_data)->gc_mark_hook;
for (sub = info->input_bfds; sub != ((void *)0); sub = sub->link_next)
{
asection *o;
if (((sub)->xvec->flavour) != bfd_target_elf_flavour)
continue;
for (o = sub->sections; o != ((void *)0); o = o->next)
{
if (o->flags & 0x1000000)
if (!elf_gc_mark (info, o, gc_mark_hook))
return false;
}
}
if (!elf_gc_sweep (info, ((struct elf_backend_data *) (abfd)->xvec->backend_data)->gc_sweep_hook))
return false;
return true;
}
boolean
_bfd_elf64_gc_record_vtinherit (abfd, sec, h, offset)
bfd *abfd;
asection *sec;
struct elf_link_hash_entry *h;
bfd_vma offset;
{
struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
struct elf_link_hash_entry **search, *child;
bfd_size_type extsymcount;
extsymcount = ((abfd) -> tdata.elf_obj_data)->symtab_hdr.sh_size/sizeof (Elf64_External_Sym);
if (!(((abfd) -> tdata.elf_obj_data) -> bad_symtab))
extsymcount -= ((abfd) -> tdata.elf_obj_data)->symtab_hdr.sh_info;
sym_hashes = (((abfd) -> tdata.elf_obj_data) -> sym_hashes);
sym_hashes_end = sym_hashes + extsymcount;
for (search = sym_hashes; search != sym_hashes_end; ++search)
{
if ((child = *search) != ((void *)0)
&& (child->root.type == bfd_link_hash_defined
|| child->root.type == bfd_link_hash_defweak)
&& child->root.u.def.section == sec
&& child->root.u.def.value == offset)
goto win;
}
(*_bfd_error_handler) ("%s: %s+%lu: No symbol found for INHERIT",
bfd_archive_filename (abfd), sec->name,
(unsigned long) offset);
bfd_set_error (bfd_error_invalid_operation);
return false;
win:
if (!h)
{
child->vtable_parent = (struct elf_link_hash_entry *) -1;
}
else
child->vtable_parent = h;
return true;
}
boolean
_bfd_elf64_gc_record_vtentry (abfd, sec, h, addend)
bfd *abfd __attribute__ ((__unused__));
asection *sec __attribute__ ((__unused__));
struct elf_link_hash_entry *h;
bfd_vma addend;
{
struct elf_backend_data *bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
int file_align = bed->s->file_align;
if (addend >= h->vtable_entries_size)
{
size_t size, bytes;
boolean *ptr = h->vtable_entries_used;
if (h->root.type == bfd_link_hash_undefined)
size = addend;
else
{
size = h->size;
if (size < addend)
{
size = addend;
}
}
bytes = (size / file_align + 1) * sizeof (boolean);
if (ptr)
{
ptr = bfd_realloc (ptr - 1, (bfd_size_type) bytes);
if (ptr != ((void *)0))
{
size_t oldbytes;
oldbytes = ((h->vtable_entries_size / file_align + 1)
* sizeof (boolean));
(__extension__ (__builtin_constant_p (0) && (0) == '\0' ? ({ void *__s = (((char *) ptr) + oldbytes); __builtin_memset (__s, '\0', bytes - oldbytes); __s; }) : memset (((char *) ptr) + oldbytes, 0, bytes - oldbytes)));
}
}
else
ptr = bfd_zmalloc ((bfd_size_type) bytes);
if (ptr == ((void *)0))
return false;
h->vtable_entries_used = ptr + 1;
h->vtable_entries_size = size;
}
h->vtable_entries_used[addend / file_align] = true;
return true;
}
boolean
_bfd_elf64_gc_common_finalize_got_offsets (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
bfd *i;
struct elf_backend_data *bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
bfd_vma gotoff;
if (bed->want_got_plt)
gotoff = 0;
else
gotoff = bed->got_header_size;
for (i = info->input_bfds; i; i = i->link_next)
{
bfd_signed_vma *local_got;
bfd_size_type j, locsymcount;
Elf_Internal_Shdr *symtab_hdr;
if (((i)->xvec->flavour) != bfd_target_elf_flavour)
continue;
local_got = (((i) -> tdata.elf_obj_data) -> local_got.refcounts);
if (!local_got)
continue;
symtab_hdr = &((i) -> tdata.elf_obj_data)->symtab_hdr;
if ((((i) -> tdata.elf_obj_data) -> bad_symtab))
locsymcount = symtab_hdr->sh_size / sizeof (Elf64_External_Sym);
else
locsymcount = symtab_hdr->sh_info;
for (j = 0; j < locsymcount; ++j)
{
if (local_got[j] > 0)
{
local_got[j] = gotoff;
gotoff += 64 / 8;
}
else
local_got[j] = (bfd_vma) -1;
}
}
(bfd_link_hash_traverse (&(((struct elf_link_hash_table *) ((info)->hash)))->root, (boolean (*) (struct bfd_link_hash_entry *, void *)) (elf_gc_allocate_got_offsets), ((void *) &gotoff)));
return true;
}
static boolean
elf_gc_allocate_got_offsets (h, offarg)
struct elf_link_hash_entry *h;
void * offarg;
{
bfd_vma *off = (bfd_vma *) offarg;
if (h->got.refcount > 0)
{
h->got.offset = off[0];
off[0] += 64 / 8;
}
else
h->got.offset = (bfd_vma) -1;
return true;
}
boolean
_bfd_elf64_gc_common_final_link (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
if (!_bfd_elf64_gc_common_finalize_got_offsets (abfd, info))
return false;
return bfd_elf64_bfd_final_link (abfd, info);
}
static boolean
elf_collect_hash_codes (h, data)
struct elf_link_hash_entry *h;
void * data;
{
unsigned long **valuep = (unsigned long **) data;
const char *name;
char *p;
unsigned long ha;
char *alc = ((void *)0);
if (h->dynindx == -1)
return true;
name = h->root.root.string;
p = (__extension__ (__builtin_constant_p ('@') && ('@') == '\0' ? (char *) __rawmemchr (name, '@') : strchr (name, '@')));
if (p != ((void *)0))
{
alc = bfd_malloc ((bfd_size_type) (p - name + 1));
memcpy (alc, name, (size_t) (p - name));
alc[p - name] = '\0';
name = alc;
}
ha = bfd_elf_hash (name);
*(*valuep)++ = ha;
h->elf_hash_value = ha;
if (alc != ((void *)0))
free (alc);
return true;
}
boolean
_bfd_elf64_reloc_symbol_deleted_p (offset, cookie)
bfd_vma offset;
void * cookie;
{
struct elf_reloc_cookie *rcookie = (struct elf_reloc_cookie *)cookie;
if (rcookie->bad_symtab)
rcookie->rel = rcookie->rels;
for (; rcookie->rel < rcookie->relend; rcookie->rel++)
{
unsigned long r_symndx = ((rcookie->rel->r_info) >> 32);
Elf_Internal_Sym isym;
if (! rcookie->bad_symtab)
if (rcookie->rel->r_offset > offset)
return false;
if (rcookie->rel->r_offset != offset)
continue;
if (rcookie->locsyms && r_symndx < rcookie->locsymcount)
bfd_elf64_swap_symbol_in (rcookie->abfd,
(Elf64_External_Sym *) rcookie->locsyms + r_symndx,
&isym);
if (r_symndx >= rcookie->locsymcount
|| (rcookie->locsyms
&& (((unsigned int)(isym.st_info)) >> 4) != 0))
{
struct elf_link_hash_entry *h;
h = rcookie->sym_hashes[r_symndx - rcookie->extsymoff];
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;
if ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& ! ((h->root.u.def.section) == ((asection *) &bfd_abs_section))
&& ((h->root.u.def.section ->output_section) == ((asection *) &bfd_abs_section)))
return true;
else
return false;
}
else if (rcookie->locsyms)
{
asection *isec;
if (isym.st_shndx > 0 && isym.st_shndx < 0xFF00)
{
isec = bfd_section_from_elf_index (rcookie->abfd, isym.st_shndx);
if (isec != ((void *)0)
&& ! ((isec) == ((asection *) &bfd_abs_section))
&& ((isec->output_section) == ((asection *) &bfd_abs_section)))
return true;
}
}
return false;
}
return false;
}
boolean
bfd_elf64_discard_info (info)
struct bfd_link_info *info;
{
struct elf_reloc_cookie cookie;
asection *o;
Elf_Internal_Shdr *symtab_hdr;
Elf64_External_Sym *freesyms;
struct elf_backend_data *bed;
bfd *abfd;
boolean ret = false;
if (info->relocateable
|| info->traditional_format
|| info->hash->creator->flavour != bfd_target_elf_flavour
|| ! ((info)->hash->type == bfd_link_elf_hash_table)
|| info->strip == strip_all
|| info->strip == strip_debugger)
return false;
for (abfd = info->input_bfds; abfd != ((void *)0); abfd = abfd->link_next)
{
if (((abfd)->xvec->flavour) != bfd_target_elf_flavour)
continue;
bed = ((struct elf_backend_data *) (abfd)->xvec->backend_data);
if ((abfd->flags & 0x40) != 0)
continue;
o = bfd_get_section_by_name (abfd, ".stab");
if (! o && ! bed->elf_backend_discard_info)
continue;
symtab_hdr = &((abfd) -> tdata.elf_obj_data)->symtab_hdr;
cookie.abfd = abfd;
cookie.sym_hashes = (((abfd) -> tdata.elf_obj_data) -> sym_hashes);
cookie.bad_symtab = (((abfd) -> tdata.elf_obj_data) -> bad_symtab);
if (cookie.bad_symtab)
{
cookie.locsymcount =
symtab_hdr->sh_size / sizeof (Elf64_External_Sym);
cookie.extsymoff = 0;
}
else
{
cookie.locsymcount = symtab_hdr->sh_info;
cookie.extsymoff = symtab_hdr->sh_info;
}
freesyms = ((void *)0);
if (symtab_hdr->contents)
cookie.locsyms = (void *) symtab_hdr->contents;
else if (cookie.locsymcount == 0)
cookie.locsyms = ((void *)0);
else
{
bfd_size_type amt = cookie.locsymcount * sizeof (Elf64_External_Sym);
cookie.locsyms = bfd_malloc (amt);
if (cookie.locsyms == ((void *)0)
|| bfd_seek (abfd, symtab_hdr->sh_offset, 0) != 0
|| bfd_bread (cookie.locsyms, amt, abfd) != amt)
{
if (cookie.locsyms)
free (cookie.locsyms);
cookie.locsyms = ((void *)0);
}
else
{
freesyms = cookie.locsyms;
}
}
if (o)
{
cookie.rels = (_bfd_elf64_link_read_relocs
(abfd, o, (void *) ((void *)0),
(Elf_Internal_Rela *) ((void *)0),
info->keep_memory));
if (cookie.rels)
{
cookie.rel = cookie.rels;
cookie.relend =
cookie.rels + o->reloc_count * bed->s->int_rels_per_ext_rel;
if (_bfd_discard_section_stabs (abfd, o,
((struct bfd_elf_section_data*)o->used_by_bfd)->stab_info,
_bfd_elf64_reloc_symbol_deleted_p,
&cookie))
ret = true;
if (! info->keep_memory)
free (cookie.rels);
}
}
if (bed->elf_backend_discard_info)
{
if (bed->elf_backend_discard_info (abfd, &cookie, info))
ret = true;
}
if (freesyms)
free (freesyms);
}
return ret;
}
static boolean
elf_section_ignore_discarded_relocs (sec)
asection *sec;
{
if (__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (sec->name) && __builtin_constant_p (".stab") && (__s1_len = strlen (sec->name), __s2_len = strlen (".stab"), (!((size_t)(const void *)((sec->name) + 1) - (size_t)(const void *)(sec-
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
>name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((".stab") + 1) - (size_t)(const void *)(".stab") == 1) || __s2_len >= 4)) ? memcmp ((__const char *) (sec->name), (__const char *) (".stab"), (__s1_len < __s2_len ? __s1_len : __s2_len) + 1) : ( __builtin_constant_p (sec->name) && ((size_t)(const void *)((sec->name) + 1) - (size_t)(const void *)(sec->name) == 1) && (__s1_len = strlen (sec->name), __s1_len < 4) ? (__builtin_constant_p (".stab") && ((size_t)(const void *)((".stab") + 1) - (size_t) (const void *)(".stab") == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (sec->name))[0] - ((__const unsigned char *) (__const char *)(".stab"))[0]); if (__s1_len > 0 && __result ==!
0) { __result = (((__const unsigned char *) (__const char *) (sec->name))[1] - ((__const unsigned char *) (__const char *) (".stab"))[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (sec->name))[2] - ((_ _const unsigned char *) (__const char *) (".stab"))[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (sec->name))[3] - ((__const unsigned char *) (__const char *) (".stab"))[3]); } } __result; })) : (__exten sion__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) (".stab"); register int __result = (((__const unsigned char *) (__const char *) (sec->name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsi gned char *) (__const char *) (sec->name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (sec->name))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = ((!
(__const unsigned char *) (__const char *) (sec->name))[3] - !
__s2[3]); } } __result; }))) : (__builtin_constant_p (".stab") && ((size_t)(const void *)((".stab") + 1) - (size_t)(const void *)(".stab") == 1) && (__s2_len = strlen (".stab"), __s2_len < 4) ? (__builtin_constant_p (sec->name) && ((size_t)(const void *) ((sec->name) + 1) - (size_t)(const void *)(sec->name) == 1) ? (__extension__ ({ register int __result = (((__const unsigned char *) (__const char *) (sec->name))[0] - ((__const unsigned char *) (__const char *)(".stab"))[0]); if (__s2_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (sec->name))[1] - ((__const unsigned char *) (__const char *) (".stab"))[1]); if (__s2_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (sec->name))[2] - ((__const unsigned char *) (__const char *) (".stab"))[2]); if (__s2_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (sec->name))[3] - ((__const unsigned char *) (__const char *) (".stab"))[3])!
; } } __result; })) : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (sec->name); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) (".stab"))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) (".stab"))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) (".stab"))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1 [3] - ((__const unsigned char *) (__const char *) (".stab"))[3]); } } __result; }))) : strcmp (sec->name, ".stab")))); }) == 0)
return true;
else if ((((struct elf_backend_data *) (sec->owner)->xvec->backend_data)
->elf_backend_ignore_discarded_relocs != ((void *)0))
&& (*((struct elf_backend_data *) (sec->owner)->xvec->backend_data)
->elf_backend_ignore_discarded_relocs) (sec))
return true;
else
return false;
}
# 1554 "elfcode.h" 2
const struct elf_size_info _bfd_elf64_size_info = {
sizeof (Elf64_External_Ehdr),
sizeof (Elf64_External_Phdr),
sizeof (Elf64_External_Shdr),
sizeof (Elf64_External_Rel),
sizeof (Elf64_External_Rela),
sizeof (Elf64_External_Sym),
sizeof (Elf64_External_Dyn),
sizeof (Elf_External_Note),
4,
1,
64, 8,
2, 1,
bfd_elf64_write_out_phdrs,
bfd_elf64_write_shdrs_and_ehdr,
bfd_elf64_write_relocs,
bfd_elf64_swap_symbol_out,
bfd_elf64_slurp_reloc_table,
bfd_elf64_slurp_symbol_table,
bfd_elf64_swap_dyn_in,
bfd_elf64_swap_dyn_out,
((void *)0),
((void *)0),
((void *)0),
((void *)0)
};
# 23 "elf64.c" 2
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2002-04-26 9:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-04-26 2:07 c/5124: gcc fails to compile binutils on alpha rth
-- strict thread matches above, loose matches on Subject: below --
2001-12-15 6:06 dl8bcu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).