diff options
author | Ian Lance Taylor <ian@airs.com> | 2008-04-16 22:54:29 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2008-04-16 22:54:29 +0000 |
commit | 12c0daef5f792cf27f8d0897794bb32729dc370b (patch) | |
tree | a282dbfb5ea5b87e31cd1eb4e61bf04584bcd9f7 /gold/reloc.h | |
parent | 4f4995b6282c41516d0bd895832ced99d799a744 (diff) | |
download | binutils-12c0daef5f792cf27f8d0897794bb32729dc370b.zip binutils-12c0daef5f792cf27f8d0897794bb32729dc370b.tar.gz binutils-12c0daef5f792cf27f8d0897794bb32729dc370b.tar.bz2 |
* copy-relocs.cc: New file.
* copy-relocs.h: New file.
* reloc.cc: Remove Copy_relocs code.
* reloc.h: Likewise.
* reloc-types.h (struct Reloc_types) [both versions]: Add
get_reloc_addend_noerror.
* output.h (class Output_data_reloc<elfcpp::SHT_REL>): Add
variants of add_global which take an addend which must be zero.
* i386.cc: Include "copy-relocs.h".
(class Target_i386): Change type of copy_relocs_ to variable,
update initializer.
(Target_i386::copy_reloc): Rewrite to pass to Copy_relocs class.
Change all callers.
(Target_i386::do_finalize_sections): Change handling of
copy_relocs_.
* sparc.cc: Include "copy-relocs.h".
(class Target_sparc): Change type of copy_relocs_ to variable,
update initializer.
(Target_sparc::copy_reloc): Rewrite to pass to Copy_relocs class.
Change all callers.
(Target_sparc::do_finalize_sections): Change handling of
copy_relocs_.
* x86_64.cc: Include "copy-relocs.h".
(class Target_x86_64): Change type of copy_relocs_ to variable,
update initializer.
(Target_x86_64::copy_reloc): Rewrite to pass to Copy_relocs
class. Change all callers.
(Target_x86_64::do_finalize_sections): Change handling of
copy_relocs_.
* Makefile.am (CCFILES): Add copy-relocs.cc.
(HFILES): Add copy-relocs.h.
Diffstat (limited to 'gold/reloc.h')
-rw-r--r-- | gold/reloc.h | 96 |
1 files changed, 0 insertions, 96 deletions
diff --git a/gold/reloc.h b/gold/reloc.h index 537738c..61f05e7 100644 --- a/gold/reloc.h +++ b/gold/reloc.h @@ -613,102 +613,6 @@ public: { This::template pcrela<64>(view, object, psymval, addend, address); } }; -// We try to avoid COPY relocations when possible. A COPY relocation -// may be required when an executable refers to a variable defined in -// a shared library. COPY relocations are problematic because they -// tie the executable to the exact size of the variable in the shared -// library. We can avoid them if all the references to the variable -// are in a writeable section. In that case we can simply use dynamic -// relocations. However, when scanning relocs, we don't know when we -// see the relocation whether we will be forced to use a COPY -// relocation or not. So we have to save the relocation during the -// reloc scanning, and then emit it as a dynamic relocation if -// necessary. This class implements that. It is used by the target -// specific code. - -template<int size, bool big_endian> -class Copy_relocs -{ - public: - Copy_relocs() - : entries_() - { } - - // Return whether we need a COPY reloc for a reloc against GSYM, - // which is being applied to section SHNDX in OBJECT. - static bool - need_copy_reloc(const General_options*, Relobj* object, unsigned int shndx, - Sized_symbol<size>* gsym); - - // Save a Rel against SYM for possible emission later. SHNDX is the - // index of the section to which the reloc is being applied. - void - save(Symbol* sym, Relobj*, unsigned int shndx, - Output_section* output_section, const elfcpp::Rel<size, big_endian>&); - - // Save a Rela against SYM for possible emission later. - void - save(Symbol* sym, Relobj*, unsigned int shndx, - Output_section* output_section, const elfcpp::Rela<size, big_endian>&); - - // Return whether there are any relocs to emit. This also discards - // entries which need not be emitted. - bool - any_to_emit(); - - // Emit relocs for each symbol which did not get a COPY reloc (i.e., - // is still defined in the dynamic object). - template<int sh_type> - void - emit(Output_data_reloc<sh_type, true, size, big_endian>*); - - private: - typedef typename elfcpp::Elf_types<size>::Elf_Addr Address; - typedef typename elfcpp::Elf_types<size>::Elf_Addr Addend; - - // This POD class holds the entries we are saving. - class Copy_reloc_entry - { - public: - Copy_reloc_entry(Symbol* sym, unsigned int reloc_type, - Relobj* relobj, unsigned int shndx, - Output_section* output_section, - Address address, Addend addend) - : sym_(sym), reloc_type_(reloc_type), relobj_(relobj), - shndx_(shndx), output_section_(output_section), - address_(address), addend_(addend) - { } - - // Return whether we should emit this reloc. If we should not - // emit, we clear it. - bool - should_emit(); - - // Emit this reloc. - - void - emit(Output_data_reloc<elfcpp::SHT_REL, true, size, big_endian>*); - - void - emit(Output_data_reloc<elfcpp::SHT_RELA, true, size, big_endian>*); - - private: - Symbol* sym_; - unsigned int reloc_type_; - Relobj* relobj_; - unsigned int shndx_; - Output_section* output_section_; - Address address_; - Addend addend_; - }; - - // A list of relocs to be saved. - typedef std::vector<Copy_reloc_entry> Copy_reloc_entries; - - // The list of relocs we are saving. - Copy_reloc_entries entries_; -}; - // Track relocations while reading a section. This lets you ask for // the relocation at a certain offset, and see how relocs occur // between points of interest. |