/* BFD back-end data structures for ELF files.
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
PREFIX and finish with the last SUFFIX_LENGTH chars of PREFIX. */
int suffix_length;
int type;
- int attr;
+ bfd_vma attr;
};
enum action_discarded
/* Count relocations. Not called for relocatable links
or if all relocs are being preserved in the output. */
unsigned int (*elf_backend_count_relocs)
- (asection *, Elf_Internal_Rela *);
+ (struct bfd_link_info *, asection *);
/* This function, if defined, is called when an NT_PRSTATUS note is found
in a core file. */
so-called reserved entries on some systems. */
bfd_vma got_header_size;
+ /* The size of the GOT entry for the symbol pointed to by H if non-NULL,
+ otherwise by the local symbol with index SYMNDX in IBFD. */
+ bfd_vma (*got_elt_size) (bfd *, struct bfd_link_info *,
+ struct elf_link_hash_entry *h,
+ bfd *ibfd, unsigned long symndx);
+
/* The vendor name to use for a processor-standard attributes section. */
const char *obj_attrs_vendor;
/* The section type to use for an attributes section. */
unsigned int obj_attrs_section_type;
+ /* This function determines the order in which any attributes are written.
+ It must be defined for input in the range 4..NUM_KNOWN_OBJ_ATTRIBUTES-1
+ (this range is used in order to make unity easy). The returned value is
+ the actual tag number to place in the input position. */
+ int (*obj_attrs_order) (int);
+
/* This is TRUE if the linker should act like collect and gather
global constructors and destructors by name. This is TRUE for
MIPS ELF because the Irix 5 tools can not handle the .init
section. */
unsigned default_use_rela_p : 1;
+ /* True if PLT and copy relocations should be RELA by default. */
+ unsigned rela_plts_and_copies_p : 1;
+
/* Set if RELA relocations for a relocatable link can be handled by
generic code. Backends that set this flag need do nothing in the
backend relocate_section routine for relocatable linking. */
#define get_elf_backend_data(abfd) \
xvec_get_elf_backend_data ((abfd)->xvec)
-/* This struct is used to pass information to routines called via
- elf_link_hash_traverse which must return failure. */
-
-struct elf_info_failed
-{
- bfd_boolean failed;
- struct bfd_link_info *info;
- struct bfd_elf_version_tree *verdefs;
-};
-
-/* This structure is used to pass information to
- _bfd_elf_link_assign_sym_version. */
-
-struct elf_assign_sym_version_info
-{
- /* Output BFD. */
- bfd *output_bfd;
- /* General link information. */
- struct bfd_link_info *info;
- /* Version tree. */
- struct bfd_elf_version_tree *verdefs;
- /* Whether we had a failure. */
- bfd_boolean failed;
-};
-
-/* This structure is used to pass information to
- _bfd_elf_link_find_version_dependencies. */
-
-struct elf_find_verdep_info
-{
- /* Output BFD. */
- bfd *output_bfd;
- /* General link information. */
- struct bfd_link_info *info;
- /* The number of dependencies. */
- unsigned int vers;
- /* Whether we had a failure. */
- bfd_boolean failed;
-};
-
/* The maximum number of known object attributes for any target. */
-#define NUM_KNOWN_OBJ_ATTRIBUTES 32
+#define NUM_KNOWN_OBJ_ATTRIBUTES 71
-/* The value of an object attribute. type & 1 indicates whether there
- is an integer value; type & 2 indicates whether there is a string
- value. */
+/* The value of an object attribute. The type indicates whether the attribute
+ holds and integer, a string, or both. It can also indicate that there can
+ be no default (i.e. all values must be written to file, even zero). */
typedef struct obj_attribute
{
+#define ATTR_TYPE_FLAG_INT_VAL (1 << 0)
+#define ATTR_TYPE_FLAG_STR_VAL (1 << 1)
+#define ATTR_TYPE_FLAG_NO_DEFAULT (1 << 2)
+
+#define ATTR_TYPE_HAS_INT_VAL(TYPE) ((TYPE) & ATTR_TYPE_FLAG_INT_VAL)
+#define ATTR_TYPE_HAS_STR_VAL(TYPE) ((TYPE) & ATTR_TYPE_FLAG_STR_VAL)
+#define ATTR_TYPE_HAS_NO_DEFAULT(TYPE) ((TYPE) & ATTR_TYPE_FLAG_NO_DEFAULT)
+
int type;
unsigned int i;
char *s;
ARM_ELF_TDATA,
HPPA_ELF_TDATA,
I386_ELF_TDATA,
+ MIPS_ELF_TDATA,
PPC32_ELF_TDATA,
PPC64_ELF_TDATA,
S390_ELF_TDATA,
SH_ELF_TDATA,
SPARC_ELF_TDATA,
X86_64_ELF_TDATA,
+ XTENSA_ELF_TDATA,
GENERIC_ELF_TDATA
};
(bfd *, sec_ptr);
extern long _bfd_elf_canonicalize_reloc
(bfd *, sec_ptr, arelent **, asymbol **);
+extern asection * _bfd_elf_get_dynamic_reloc_section
+ (bfd *, asection *, bfd_boolean);
+extern asection * _bfd_elf_make_dynamic_reloc_section
+ (asection *, bfd *, unsigned int, bfd *, bfd_boolean);
extern long _bfd_elf_get_dynamic_reloc_upper_bound
(bfd *);
extern long _bfd_elf_canonicalize_dynamic_reloc
extern bfd_boolean _bfd_elf_hash_symbol (struct elf_link_hash_entry *);
-extern bfd_boolean _bfd_elf_add_default_symbol
- (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
- const char *, Elf_Internal_Sym *, asection **, bfd_vma *,
- bfd_boolean *, bfd_boolean);
-
-extern bfd_boolean _bfd_elf_export_symbol
- (struct elf_link_hash_entry *, void *);
-
-extern bfd_boolean _bfd_elf_link_find_version_dependencies
- (struct elf_link_hash_entry *, void *);
-
-extern bfd_boolean _bfd_elf_link_assign_sym_version
- (struct elf_link_hash_entry *, void *);
-
extern long _bfd_elf_link_lookup_local_dynindx
(struct bfd_link_info *, bfd *, long);
extern bfd_boolean _bfd_elf_compute_section_file_positions
extern Elf_Internal_Rela *_bfd_elf_link_read_relocs
(bfd *, asection *, void *, Elf_Internal_Rela *, bfd_boolean);
-extern bfd_boolean _bfd_elf_link_size_reloc_section
- (bfd *, Elf_Internal_Shdr *, asection *);
-
extern bfd_boolean _bfd_elf_link_output_relocs
(bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *,
struct elf_link_hash_entry **);
-extern bfd_boolean _bfd_elf_fix_symbol_flags
- (struct elf_link_hash_entry *, struct elf_info_failed *);
-
-extern bfd_boolean _bfd_elf_adjust_dynamic_symbol
- (struct elf_link_hash_entry *, void *);
-
extern bfd_boolean _bfd_elf_adjust_dynamic_copy
(struct elf_link_hash_entry *, asection *);
-extern bfd_boolean _bfd_elf_link_sec_merge_syms
- (struct elf_link_hash_entry *, void *);
-
extern bfd_boolean _bfd_elf_dynamic_symbol_p
(struct elf_link_hash_entry *, struct bfd_link_info *, bfd_boolean);
extern int bfd_elf_link_record_local_dynamic_symbol
(struct bfd_link_info *, bfd *, long);
-extern void bfd_elf_link_mark_dynamic_symbol
- (struct bfd_link_info *, struct elf_link_hash_entry *,
- Elf_Internal_Sym *);
-
extern bfd_boolean _bfd_elf_close_and_cleanup
(bfd *);
extern void _bfd_dwarf2_cleanup_debug_info
(bfd *);
+extern bfd_vma _bfd_elf_default_got_elt_size
+(bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, bfd *,
+ unsigned long);
+
extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn
(bfd *, arelent *, struct bfd_symbol *, void *,
asection *, bfd *, char **);
(bfd *, char *, int *, const void *, int);
extern char *elfcore_write_ppc_vmx
(bfd *, char *, int *, const void *, int);
+extern char *elfcore_write_ppc_vsx
+ (bfd *, char *, int *, const void *, int);
extern char *elfcore_write_lwpstatus
(bfd *, char *, int *, long, int, const void *);
+extern char *elfcore_write_register_note
+ (bfd *, char *, int *, const char *, const void *, int);
extern bfd *_bfd_elf32_bfd_from_remote_memory
(bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep,
extern void bfd_elf_add_obj_attr_string (bfd *, int, int, const char *);
#define bfd_elf_add_proc_attr_string(BFD, TAG, VALUE) \
bfd_elf_add_obj_attr_string ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE))
-extern void bfd_elf_add_obj_attr_compat (bfd *, int, unsigned int,
- const char *);
-#define bfd_elf_add_proc_attr_compat(BFD, INTVAL, STRVAL) \
- bfd_elf_add_obj_attr_compat ((BFD), OBJ_ATTR_PROC, (INTVAL), (STRVAL))
+extern void bfd_elf_add_obj_attr_int_string (bfd *, int, int, unsigned int,
+ const char *);
+#define bfd_elf_add_proc_attr_int_string(BFD, TAG, INTVAL, STRVAL) \
+ bfd_elf_add_obj_attr_int_string ((BFD), OBJ_ATTR_PROC, (TAG), \
+ (INTVAL), (STRVAL))
extern char *_bfd_elf_attr_strdup (bfd *, const char *);
extern void _bfd_elf_copy_obj_attributes (bfd *, bfd *);