diff options
author | Doug Kwan <dougkwan@google.com> | 2009-10-01 00:58:38 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2009-10-01 00:58:38 +0000 |
commit | 966d4097440bd7c3e35524bebf39d8bbe2e26fd6 (patch) | |
tree | 80a25b71ca7f2b3529c90ee004d50fb78239c298 | |
parent | 7cacf37ef6dca17f1e65cbfa073faac07504397f (diff) | |
download | binutils-gdb-966d4097440bd7c3e35524bebf39d8bbe2e26fd6.tar.gz |
2009-09-30 Doug Kwan <dougkwan@google.com>
* arm.cc (Target_arm::may_need_copy_reloc): Check for THUMB function
symbol and call Symbol::may_need_copy_reloc to determine if
a copy reloc is needed.
* copy-relocs.cc (Copy_relocs::need_copy_reloc): Return false if -z
nocopyreloc is given in command line.
(Copy_relocs::emit_copy_reloc): Assert that -z nocopyreloc is not
given in command line.
* i386.cc (Target_i386::may_need_copy_reloc): Remove.
(Target_i386::Scan::global): Use Symbol::may_need_copy_reloc instead
of the removed Target_i386::may_need_copy_reloc.
* options.h (copyreloc): New option with default value false.
* powerpc.cc (Target_powerpc::may_need_copy_reloc): Remove.
(Target_powerpc::Scan::global): Use Symbol::may_need_copy_reloc
instead of the removed Target_powerpc::may_need_copy_reloc.
* sparc.cc (Target_powerpc::may_need_copy_reloc): Remove.
(Target_sparc::Scan::global): Use Symbol::may_need_copy_reloc
instead of the removed Target_sparc::may_need_copy_reloc.
* symtab.h (Symbol::may_need_copy_reloc): New method definition.
* x86_64.cc (Target_powerpc::may_need_copy_reloc): Remove.
(Target_x86_64::Scan::global): Use Symbol::may_need_copy_reloc
instead of the removed Target_x86_64::may_need_copy_reloc.
-rw-r--r-- | gold/ChangeLog | 24 | ||||
-rw-r--r-- | gold/arm.cc | 6 | ||||
-rw-r--r-- | gold/copy-relocs.cc | 6 | ||||
-rw-r--r-- | gold/i386.cc | 15 | ||||
-rw-r--r-- | gold/options.h | 3 | ||||
-rw-r--r-- | gold/powerpc.cc | 15 | ||||
-rw-r--r-- | gold/sparc.cc | 15 | ||||
-rw-r--r-- | gold/symtab.h | 12 | ||||
-rw-r--r-- | gold/x86_64.cc | 15 |
9 files changed, 54 insertions, 57 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 296765a6cb9..8068a64fc81 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,27 @@ +2009-09-30 Doug Kwan <dougkwan@google.com> + + * arm.cc (Target_arm::may_need_copy_reloc): Check for THUMB function + symbol and call Symbol::may_need_copy_reloc to determine if + a copy reloc is needed. + * copy-relocs.cc (Copy_relocs::need_copy_reloc): Return false if -z + nocopyreloc is given in command line. + (Copy_relocs::emit_copy_reloc): Assert that -z nocopyreloc is not + given in command line. + * i386.cc (Target_i386::may_need_copy_reloc): Remove. + (Target_i386::Scan::global): Use Symbol::may_need_copy_reloc instead + of the removed Target_i386::may_need_copy_reloc. + * options.h (copyreloc): New option with default value false. + * powerpc.cc (Target_powerpc::may_need_copy_reloc): Remove. + (Target_powerpc::Scan::global): Use Symbol::may_need_copy_reloc + instead of the removed Target_powerpc::may_need_copy_reloc. + * sparc.cc (Target_powerpc::may_need_copy_reloc): Remove. + (Target_sparc::Scan::global): Use Symbol::may_need_copy_reloc + instead of the removed Target_sparc::may_need_copy_reloc. + * symtab.h (Symbol::may_need_copy_reloc): New method definition. + * x86_64.cc (Target_powerpc::may_need_copy_reloc): Remove. + (Target_x86_64::Scan::global): Use Symbol::may_need_copy_reloc + instead of the removed Target_x86_64::may_need_copy_reloc. + 2009-09-30 Ian Lance Taylor <iant@google.com> * object.h (class Object): Remove target_ field, and target, diff --git a/gold/arm.cc b/gold/arm.cc index 6fc71a77fee..17028b5ebf7 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -405,10 +405,8 @@ class Target_arm : public Sized_target<32, big_endian> bool may_need_copy_reloc(Symbol* gsym) { - return (!parameters->options().shared() - && gsym->is_from_dynobj() - && gsym->type() != elfcpp::STT_FUNC - && gsym->type() != elfcpp::STT_ARM_TFUNC); + return (gsym->type() != elfcpp::STT_ARM_TFUNC + && gsym->may_need_copy_reloc()); } // Add a potential copy relocation. diff --git a/gold/copy-relocs.cc b/gold/copy-relocs.cc index 80b50df8838..6ef72d3ed38 100644 --- a/gold/copy-relocs.cc +++ b/gold/copy-relocs.cc @@ -84,7 +84,8 @@ Copy_relocs<sh_type, size, big_endian>::need_copy_reloc( Sized_relobj<size, big_endian>* object, unsigned int shndx) const { - // FIXME: Handle -z nocopyrelocs. + if (!parameters->options().copyreloc()) + return false; if (sym->symsize() == 0) return false; @@ -109,6 +110,9 @@ Copy_relocs<sh_type, size, big_endian>::emit_copy_reloc( Sized_symbol<size>* sym, Output_data_reloc<sh_type, true, size, big_endian>* reloc_section) { + // We should not be here if -z nocopyreloc is given. + gold_assert(parameters->options().copyreloc()); + typename elfcpp::Elf_types<size>::Elf_WXword symsize = sym->symsize(); // There is no defined way to determine the required alignment of diff --git a/gold/i386.cc b/gold/i386.cc index 0b68613d4dc..27e1cc91b5e 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -375,17 +375,6 @@ class Target_i386 : public Target_freebsd<32, false> Reloc_section* rel_dyn_section(Layout*); - // Return true if the symbol may need a COPY relocation. - // References from an executable object to non-function symbols - // defined in a dynamic object may need a COPY relocation. - bool - may_need_copy_reloc(Symbol* gsym) - { - return (!parameters->options().shared() - && gsym->is_from_dynobj() - && gsym->type() != elfcpp::STT_FUNC); - } - // Add a potential copy relocation. void copy_reloc(Symbol_table* symtab, Layout* layout, @@ -1213,7 +1202,7 @@ Target_i386::Scan::global(const General_options&, // Make a dynamic relocation if necessary. if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF)) { - if (target->may_need_copy_reloc(gsym)) + if (gsym->may_need_copy_reloc()) { target->copy_reloc(symtab, layout, object, data_shndx, output_section, gsym, reloc); @@ -1259,7 +1248,7 @@ Target_i386::Scan::global(const General_options&, flags |= Symbol::FUNCTION_CALL; if (gsym->needs_dynamic_reloc(flags)) { - if (target->may_need_copy_reloc(gsym)) + if (gsym->may_need_copy_reloc()) { target->copy_reloc(symtab, layout, object, data_shndx, output_section, gsym, reloc); diff --git a/gold/options.h b/gold/options.h index 258d6281398..24f52fa0c55 100644 --- a/gold/options.h +++ b/gold/options.h @@ -928,6 +928,9 @@ class General_options NULL); DEFINE_uint64(max_page_size, options::DASH_Z, '\0', 0, N_("Set maximum page size to SIZE"), N_("SIZE")); + DEFINE_bool(copyreloc, options::DASH_Z, '\0', true, + NULL, + N_("Do not create copy relocs")); DEFINE_bool(nodefaultlib, options::DASH_Z, '\0', false, N_("Mark object not to use default search paths"), NULL); diff --git a/gold/powerpc.cc b/gold/powerpc.cc index a940fd853fd..05d627be199 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -284,17 +284,6 @@ class Target_powerpc : public Sized_target<size, big_endian> Reloc_section* rela_dyn_section(Layout*); - // Return true if the symbol may need a COPY relocation. - // References from an executable object to non-function symbols - // defined in a dynamic object may need a COPY relocation. - bool - may_need_copy_reloc(Symbol* gsym) - { - return (!parameters->options().shared() - && gsym->is_from_dynobj() - && gsym->type() != elfcpp::STT_FUNC); - } - // Copy a relocation against a global symbol. void copy_reloc(Symbol_table* symtab, Layout* layout, @@ -1311,7 +1300,7 @@ Target_powerpc<size, big_endian>::Scan::global( // Make a dynamic relocation if necessary. if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF)) { - if (target->may_need_copy_reloc(gsym)) + if (gsym->may_need_copy_reloc()) { target->copy_reloc(symtab, layout, object, data_shndx, output_section, gsym, reloc); @@ -1364,7 +1353,7 @@ Target_powerpc<size, big_endian>::Scan::global( flags |= Symbol::FUNCTION_CALL; if (gsym->needs_dynamic_reloc(flags)) { - if (target->may_need_copy_reloc(gsym)) + if (gsym->may_need_copy_reloc()) { target->copy_reloc(symtab, layout, object, data_shndx, output_section, gsym, diff --git a/gold/sparc.cc b/gold/sparc.cc index 34288dea66d..16a6ffcfc52 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -305,17 +305,6 @@ class Target_sparc : public Sized_target<size, big_endian> Reloc_section* rela_dyn_section(Layout*); - // Return true if the symbol may need a COPY relocation. - // References from an executable object to non-function symbols - // defined in a dynamic object may need a COPY relocation. - bool - may_need_copy_reloc(Symbol* gsym) - { - return (!parameters->options().shared() - && gsym->is_from_dynobj() - && gsym->type() != elfcpp::STT_FUNC); - } - // Copy a relocation against a global symbol. void copy_reloc(Symbol_table* symtab, Layout* layout, @@ -1984,7 +1973,7 @@ Target_sparc<size, big_endian>::Scan::global( flags |= Symbol::FUNCTION_CALL; if (gsym->needs_dynamic_reloc(flags)) { - if (target->may_need_copy_reloc(gsym)) + if (gsym->may_need_copy_reloc()) { target->copy_reloc(symtab, layout, object, data_shndx, output_section, gsym, @@ -2040,7 +2029,7 @@ Target_sparc<size, big_endian>::Scan::global( // Make a dynamic relocation if necessary. if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF)) { - if (target->may_need_copy_reloc(gsym)) + if (gsym->may_need_copy_reloc()) { target->copy_reloc(symtab, layout, object, data_shndx, output_section, gsym, reloc); diff --git a/gold/symtab.h b/gold/symtab.h index ef8e68032bd..8dd7a722801 100644 --- a/gold/symtab.h +++ b/gold/symtab.h @@ -726,6 +726,18 @@ class Symbol set_is_forced_local() { this->is_forced_local_ = true; } + // Return true if this may need a COPY relocation. + // References from an executable object to non-function symbols + // defined in a dynamic object may need a COPY relocation. + bool + may_need_copy_reloc() const + { + return (!parameters->options().shared() + && parameters->options().copyreloc() + && this->is_from_dynobj() + && this->type() != elfcpp::STT_FUNC); + } + protected: // Instances of this class should always be created at a specific // size. diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 9287d581b1d..419746dc529 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -375,17 +375,6 @@ class Target_x86_64 : public Target_freebsd<64, false> Reloc_section* rela_dyn_section(Layout*); - // Return true if the symbol may need a COPY relocation. - // References from an executable object to non-function symbols - // defined in a dynamic object may need a COPY relocation. - bool - may_need_copy_reloc(Symbol* gsym) - { - return (!parameters->options().shared() - && gsym->is_from_dynobj() - && gsym->type() != elfcpp::STT_FUNC); - } - // Add a potential copy relocation. void copy_reloc(Symbol_table* symtab, Layout* layout, @@ -1323,7 +1312,7 @@ Target_x86_64::Scan::global(const General_options&, // Make a dynamic relocation if necessary. if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF)) { - if (target->may_need_copy_reloc(gsym)) + if (gsym->may_need_copy_reloc()) { target->copy_reloc(symtab, layout, object, data_shndx, output_section, gsym, reloc); @@ -1363,7 +1352,7 @@ Target_x86_64::Scan::global(const General_options&, flags |= Symbol::FUNCTION_CALL; if (gsym->needs_dynamic_reloc(flags)) { - if (target->may_need_copy_reloc(gsym)) + if (gsym->may_need_copy_reloc()) { target->copy_reloc(symtab, layout, object, data_shndx, output_section, gsym, reloc); |