* elf-bfd.h (_bfd_elf_rel_vtable_reloc_fn): Declare.

* elf.c (_bfd_elf_rel_vtable_reloc_fn): New.

        * elf32-i386.c (elf_howto_table): Add vtable relocs.
        (elf_i386_reloc_type_lookup): Recognize them.
        (elf_i386_check_relocs): Pass them off to generic code.
        (elf_i386_relocate_section): Ignore them.
        (elf_i386_gc_mark_hook, elf_i386_gc_sweep_hook): New.
        (elf_backend_can_gc_sections): True.
This commit is contained in:
Richard Henderson 1998-08-29 02:43:47 +00:00
parent 07f50e4e2c
commit 09e5322ac0
3 changed files with 137 additions and 37 deletions

View File

@ -1,4 +1,15 @@
start-sanitize-armelf
Fri Aug 28 19:38:53 1998 Richard Henderson <rth@cygnus.com>
* elf-bfd.h (_bfd_elf_rel_vtable_reloc_fn): Declare.
* elf.c (_bfd_elf_rel_vtable_reloc_fn): New.
* elf32-i386.c (elf_howto_table): Add vtable relocs.
(elf_i386_reloc_type_lookup): Recognize them.
(elf_i386_check_relocs): Pass them off to generic code.
(elf_i386_relocate_section): Ignore them.
(elf_i386_gc_mark_hook, elf_i386_gc_sweep_hook): New.
(elf_backend_can_gc_sections): True.
Thu Aug 20 15:03:45 1998 Nick Clifton <nickc@cygnus.com>
* elf32-arm.c (elf32_thumb_to_arm_stub): Check sym_sec is not NULL
@ -6,7 +17,7 @@ Thu Aug 20 15:03:45 1998 Nick Clifton <nickc@cygnus.com>
(elf32_arm_to_thumb_stub): Ditto.
(elf32_arm_relocate_section): Compute name before calling
elf32_arm_final_link_relocate().
end-sanitize-armelf
Wed Aug 19 15:43:26 1998 Michael Snyder <msnyder@cleaver.cygnus.com>
* elfcode.h (elf_object_p): Reject files of header type ET_CORE
@ -37,12 +48,11 @@ Wed Aug 19 15:43:26 1998 Michael Snyder <msnyder@cleaver.cygnus.com>
R_PPC_EMB_SDA21, R_PPC_EMB_RELSDA. In all these cases also ignore
output_offset for correct evaluation of addend.
start-sanitize-armelf
Tue Aug 18 11:48:12 1998 Catherine Moore <clm@cygnus.com>
* elf32-arm.c: Add prefix bfd_ to elf32_arm_get_bfd_for_interworking,
elf32_arm_allocate_interworking_sections and
elf32_arm_process_before_allocation.
elf32_arm_allocate_interworking_sections and
elf32_arm_process_before_allocation.
Tue Aug 18 11:46:00 1998 Nick Clifton <nickc@cygnus.com>
@ -52,7 +62,6 @@ Tue Aug 18 11:46:00 1998 Nick Clifton <nickc@cygnus.com>
* bfd-in2.h: Regenerate.
end-sanitize-armelf
Sat Aug 15 20:55:08 1998 Richard Henderson <rth@cygnus.com>
* elf64-alpha.c (elf64_alpha_relax_section): Handle indirect symbols.
@ -62,7 +71,6 @@ Fri Aug 14 09:12:28 1998 Stan Cox <scox@cygnus.com>
* aoutx.h (aout_link_input_section_ext): Use the relocation already
calculated for RELOC_SPARC_REV32 case.
start-sanitize-armelf
Thu Aug 13 14:02:02 1998 Catherine Moore <clm@cygnus.com>
* bfd-in.h: Add prototypes for elf32_arm_get_bfd_for_interworking,
@ -88,7 +96,6 @@ Thu Aug 13 14:02:02 1998 Catherine Moore <clm@cygnus.com>
(elf32_arm_relocate_section): Pass symbol section to
elf32_arm_final_link_relocate.
end-sanitize-armelf
Wed Aug 12 19:00:39 1998 Geoff Keating <geoffk@ozemail.com.au>
* elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Generate PLT
@ -99,14 +106,11 @@ Wed Aug 12 14:48:33 1998 Ian Lance Taylor <ian@cygnus.com>
* libaout.h: Remove nested comment to avoid warning.
start-sanitize-armelf
Wed Aug 12 08:10:11 1998 Catherine Moore <clm@cygnus.com>
* elf32-arm.c (elf32_arm_final_link_relocate): Rework
R_ARM_PC24 relocation.
end-sanitize-armelf
start-sanitize-armelf
Tue Aug 11 14:42:26 1998 Catherine Moore <clm@cygnus.com>
* elf32-arm.c (elf32_arm_final_link_relocate): Remove unused
@ -115,7 +119,6 @@ Tue Aug 11 14:42:26 1998 Catherine Moore <clm@cygnus.com>
(elf32_arm_relocate_section): Don't pass local sym and pass
sym_flags to elf32_arm_final_link_relocate.
end-sanitize-armelf
Mon Aug 10 20:38:39 1998 Richard Henderson <rth@cygnus.com>
* elf64-alpha.c (elf64_alpha_calc_dynrel_sizes): Correct last change
@ -139,13 +142,11 @@ Mon Aug 10 17:31:21 1998 Ian Lance Taylor <ian@cygnus.com>
* ieee.c (ieee_write_processor): Correct the processor ID written
out for bfd_arch_m68k, accommodating change of March 25.
start-sanitize-armelf
Sun Aug 9 20:55:44 1998 Catherine Moore <clm@cygnus.com>
* elf32-arm.c (elf32_arm_final_link_relocate): Rework
R_ARM_THM_RPC22 relocations.
end-sanitize-armelf
Sat Aug 8 15:15:30 1998 Richard Henderson <rth@cygnus.com>
* elf64-alpha.c (alpha_elf_dynamic_symbol_p): Undef weak symbols
@ -153,7 +154,6 @@ Sat Aug 8 15:15:30 1998 Richard Henderson <rth@cygnus.com>
(elf64_alpha_calc_dynrel_sizes): Allow enough room for RELATIVE
.got relocs in -Bsymbolic shared objects.
start-sanitize-armelf
Wed Aug 5 15:48:08 1998 Nick Clifton <nickc@cygnus.com>
* elf32-arm.c: Add private flags to ELF header.
@ -162,7 +162,6 @@ Wed Aug 5 15:48:08 1998 Nick Clifton <nickc@cygnus.com>
(elf32_arm_copy_private_flags): New Function.
(elf32_arm_merge_private_bfd_data): New Function.
end-sanitize-armelf
Mon Aug 3 17:10:15 1998 Ian Lance Taylor <ian@cygnus.com>
* elf32-sparc.c (elf32_sparc_check_relocs): Permit WPLT30 against
@ -181,7 +180,6 @@ Sun Aug 2 03:19:23 1998 Richard Henderson <rth@cygnus.com>
* elf32-mips.c (_bfd_mips_elf_section_from_shdr): Don't pass
".liblist" string through gettext.
start-sanitize-armelf
Fri Jul 31 16:38:14 1998 Catherine Moore <clm@cygnus.com>
* Makefile.am: Add support for elf32-arm.lo.
@ -195,7 +193,6 @@ Fri Jul 31 16:38:14 1998 Catherine Moore <clm@cygnus.com>
bfd_target bfd_elf32_littlearm_vec.
* elf32-arm.c: New file.
end-sanitize-armelf
Tue Jun 28 19:05:28 1998 Stan Cox <scox@cygnus.com>
* libaout.h (M_SPARCLITE_LE): New machine.

View File

@ -1,5 +1,5 @@
/* BFD back-end data structures for ELF files.
Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
@ -96,17 +96,24 @@ struct elf_link_hash_entry
struct elf_link_hash_entry *weakdef;
/* If this symbol requires an entry in the global offset table, the
processor specific backend uses this field to hold the offset
into the .got section. If this field is -1, then the symbol does
not require a global offset table entry. */
bfd_vma got_offset;
processor specific backend uses this field to track usage and
final offset. We use a union and two names primarily to document
the intent of any particular piece of code. The field should be
used as a count until size_dynamic_sections, at which point the
contents of the .got is fixed. Afterward, if this field is -1,
then the symbol does not require a global offset table entry. */
union
{
bfd_signed_vma refcount;
bfd_vma offset;
} got;
/* If this symbol requires an entry in the procedure linkage table,
the processor specific backend uses these two fields to hold the
offset into the procedure linkage section and the offset into the
.got section. If plt_offset is -1, then the symbol does not
require an entry in the procedure linkage table. */
bfd_vma plt_offset;
/* Same, but tracks a procedure linkage table entry. */
union
{
bfd_signed_vma refcount;
bfd_vma offset;
} plt;
/* If this symbol is used in the linker created sections, the processor
specific backend uses this field to map the field into the offset
@ -126,6 +133,14 @@ struct elf_link_hash_entry
struct bfd_elf_version_tree *vertree;
} verinfo;
/* Virtual table entry use information. This array is of size
size/sizeof(target_void_pointer), and indexed via
offset/sizeof(void*) as well. */
boolean *vtable_entries_used;
/* Virtual table derivation info. */
struct elf_link_hash_entry *vtable_parent;
/* Symbol type (STT_NOTYPE, STT_OBJECT, etc.). */
char type;
@ -152,6 +167,10 @@ struct elf_link_hash_entry
#define ELF_LINK_NON_ELF 0200
/* Symbol should be marked as hidden in the version information. */
#define ELF_LINK_HIDDEN 0400
/* Symbol was forced to local scope due to a version script file. */
#define ELF_LINK_FORCED_LOCAL 01000
/* Symbol was marked during garbage collection. */
#define ELF_LINK_HASH_MARK 02000
};
/* ELF linker hash table. */
@ -471,6 +490,20 @@ struct elf_backend_data
backend specific fashion. */
boolean (*elf_backend_modify_segment_map) PARAMS ((bfd *));
/* This function is called during section gc to discover the section a
particular relocation refers to. It need not be defined for hosts
that have no queer relocation types. */
asection * (*gc_mark_hook)
PARAMS ((bfd *abfd, struct bfd_link_info *, Elf_Internal_Rela *,
struct elf_link_hash_entry *h, Elf_Internal_Sym *));
/* This function, if defined, is called during the sweep phase of gc
in order that a backend might update any data structures it might
be maintaining. */
boolean (*gc_sweep_hook)
PARAMS ((bfd *abfd, struct bfd_link_info *info, asection *o,
const Elf_Internal_Rela *relocs));
/* The swapping table to use when dealing with ECOFF information.
Used for the MIPS ELF .mdebug section. */
const struct ecoff_debug_swap *elf_backend_ecoff_debug_swap;
@ -481,9 +514,21 @@ struct elf_backend_data
const struct elf_size_info *s;
/* offset of the _GLOBAL_OFFSET_TABLE_ symbol from the start of the
.got section */
bfd_vma got_symbol_offset;
/* The size in bytes of the headers for the GOT and PLT. This includes
the so-called reserved entries on some systems. */
bfd_vma got_header_size;
bfd_vma plt_header_size;
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;
};
/* Information stored for each BFD section in an ELF file. This
@ -557,7 +602,7 @@ typedef struct elf_linker_section
bfd_vma max_hole_offset; /* maximum offset for the hole */
elf_linker_section_enum_t which; /* which section this is */
boolean hole_written_p; /* whether the hole has been initialized */
int alignment; /* alignment for the section */
unsigned int alignment; /* alignment for the section */
flagword flags; /* flags to use to create the section */
} elf_linker_section_t;
@ -613,8 +658,17 @@ struct elf_obj_tdata
struct elf_link_hash_entry **sym_hashes;
/* A mapping from local symbols to offsets into the global offset
table, used when linking. This is indexed by the symbol index. */
bfd_vma *local_got_offsets;
table, used when linking. This is indexed by the symbol index.
Like for the globals, we use a union and two names primarily to
document the intent of any particular piece of code. The field
should be used as a count until size_dynamic_sections, at which
point the contents of the .got is fixed. Afterward, if an entry
is -1, then the symbol does not require a global offset table entry. */
union
{
bfd_signed_vma *refcounts;
bfd_vma *offsets;
} local_got;
/* A mapping from local symbols to offsets into the various linker
sections added. This is index by the symbol index. */
@ -649,6 +703,9 @@ struct elf_obj_tdata
find_nearest_line. */
struct mips_elf_find_line *find_line_info;
/* A place to stash dwarf2 info for this bfd. */
struct dwarf2_debug *dwarf2_find_line_info;
/* An array of stub sections indexed by symbol number, used by the
MIPS ELF linker. FIXME: We should figure out some way to only
include this field for a MIPS ELF target. */
@ -658,10 +715,10 @@ struct elf_obj_tdata
boolean flags_init;
/* Number of symbol version definitions we are about to emit. */
int cverdefs;
unsigned int cverdefs;
/* Number of symbol version references we are about to emit. */
int cverrefs;
unsigned int cverrefs;
/* Symbol version definitions in external objects. */
Elf_Internal_Verdef *verdef;
@ -690,7 +747,8 @@ struct elf_obj_tdata
#define elf_gp(bfd) (elf_tdata(bfd) -> gp)
#define elf_gp_size(bfd) (elf_tdata(bfd) -> gp_size)
#define elf_sym_hashes(bfd) (elf_tdata(bfd) -> sym_hashes)
#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got_offsets)
#define elf_local_got_refcounts(bfd) (elf_tdata(bfd) -> local_got.refcounts)
#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got.offsets)
#define elf_local_ptr_offsets(bfd) (elf_tdata(bfd) -> linker_section_pointers)
#define elf_dt_name(bfd) (elf_tdata(bfd) -> dt_name)
#define elf_bad_symtab(bfd) (elf_tdata(bfd) -> bad_symtab)
@ -742,6 +800,7 @@ extern bfd_reloc_status_type bfd_elf_generic_reloc PARAMS ((bfd *,
bfd *,
char **));
extern boolean bfd_elf_mkobject PARAMS ((bfd *));
extern boolean bfd_elf_mkcorefile PARAMS ((bfd *));
extern Elf_Internal_Shdr *bfd_elf_find_section PARAMS ((bfd *, char *));
extern boolean _bfd_elf_make_section_from_shdr
PARAMS ((bfd *abfd, Elf_Internal_Shdr *hdr, const char *name));
@ -761,6 +820,7 @@ extern boolean _bfd_elf_copy_private_symbol_data
extern boolean _bfd_elf_copy_private_section_data
PARAMS ((bfd *, asection *, bfd *, asection *));
extern boolean _bfd_elf_write_object_contents PARAMS ((bfd *));
extern boolean _bfd_elf_write_corefile_contents PARAMS ((bfd *));
extern boolean _bfd_elf_set_section_contents PARAMS ((bfd *, sec_ptr, PTR,
file_ptr,
bfd_size_type));
@ -962,6 +1022,33 @@ extern Elf_Internal_Rela *_bfd_elf64_link_read_relocs
#define bfd_elf32_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
#define bfd_elf64_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol
extern boolean _bfd_elf_close_and_cleanup PARAMS ((bfd *));
extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn
PARAMS ((bfd *, arelent *, struct symbol_cache_entry *, PTR,
asection *, bfd *, char **));
boolean _bfd_elf32_gc_sections
PARAMS ((bfd *abfd, struct bfd_link_info *info));
boolean _bfd_elf32_gc_common_finalize_got_offsets
PARAMS ((bfd *abfd, struct bfd_link_info *info));
boolean _bfd_elf32_gc_common_final_link
PARAMS ((bfd *, struct bfd_link_info *));
boolean _bfd_elf32_gc_record_vtinherit
PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma));
boolean _bfd_elf32_gc_record_vtentry
PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma));
boolean _bfd_elf64_gc_sections
PARAMS ((bfd *abfd, struct bfd_link_info *info));
boolean _bfd_elf64_gc_common_finalize_got_offsets
PARAMS ((bfd *abfd, struct bfd_link_info *info));
boolean _bfd_elf64_gc_common_final_link
PARAMS ((bfd *, struct bfd_link_info *));
boolean _bfd_elf64_gc_record_vtinherit
PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma));
boolean _bfd_elf64_gc_record_vtentry
PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma));
/* MIPS ELF specific routines. */
extern boolean _bfd_mips_elf_object_p PARAMS ((bfd *));

View File

@ -3075,11 +3075,9 @@ prep_headers (abfd)
case bfd_arch_arc:
i_ehdrp->e_machine = EM_CYGNUS_ARC;
break;
/* start-sanitize-armelf */
case bfd_arch_arm:
i_ehdrp->e_machine = EM_ARM;
break;
/* end-sanitize-armelf */
case bfd_arch_m32r:
i_ehdrp->e_machine = EM_CYGNUS_M32R;
break;
@ -4738,3 +4736,21 @@ _bfd_elf_close_and_cleanup (abfd)
return _bfd_generic_close_and_cleanup (abfd);
}
/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
in the relocation's offset. Thus we cannot allow any sort of sanity
range-checking to interfere. There is nothing else to do in processing
this reloc. */
bfd_reloc_status_type
_bfd_elf_rel_vtable_reloc_fn (abfd, re, symbol, data, is, obfd, errmsg)
bfd *abfd;
arelent *re;
struct symbol_cache_entry *symbol;
PTR data;
asection *is;
bfd *obfd;
char **errmsg;
{
return bfd_reloc_ok;
}