[PATCH][GOLD] Add -z nocopyreloc option.
Doug Kwan (關振德)
dougkwan@google.com
Thu Oct 1 00:32:00 GMT 2009
Thanks for the good suggestions. Here is the updated patch.
-Doug
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/9/30 Ian Lance Taylor <iant@google.com>:
> "Doug Kwan (關振德)" <dougkwan@google.com> writes:
>
>> This patch added a -z nocopyreloc option for compatiblity with ld.
>> Tested on x86_64 with no regression.
>
> Please instead add an option -z copyreloc, with an appropriate
> nohelpstring argument. You will get the option -z nocopyreloc for
> free. That will make the option easier to understand in the code.
>
> Also please take the opportunity to stamp out some duplication. Move
> may_need_copy_reloc to be a Symbol function. Change everything except
> ARM to just call that function. Change ARM to use
> arm_may_need_copy_reloc which can call that and also check for
> STT_ARM_TFUNC.
>
> Thanks.
>
> Ian
>
-------------- next part --------------
Index: gold/arm.cc
===================================================================
RCS file: /cvs/src/src/gold/arm.cc,v
retrieving revision 1.9
diff -u -p -r1.9 arm.cc
--- gold/arm.cc 18 Sep 2009 00:45:53 -0000 1.9
+++ gold/arm.cc 1 Oct 2009 00:15:37 -0000
@@ -405,10 +405,8 @@ class Target_arm : public Sized_target<3
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.
Index: gold/copy-relocs.cc
===================================================================
RCS file: /cvs/src/src/gold/copy-relocs.cc,v
retrieving revision 1.4
diff -u -p -r1.4 copy-relocs.cc
--- gold/copy-relocs.cc 10 Jul 2008 23:01:19 -0000 1.4
+++ gold/copy-relocs.cc 1 Oct 2009 00:15:37 -0000
@@ -84,7 +84,8 @@ Copy_relocs<sh_type, size, big_endian>::
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>::
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
Index: gold/i386.cc
===================================================================
RCS file: /cvs/src/src/gold/i386.cc,v
retrieving revision 1.88
diff -u -p -r1.88 i386.cc
--- gold/i386.cc 22 Jun 2009 06:51:53 -0000 1.88
+++ gold/i386.cc 1 Oct 2009 00:15:38 -0000
@@ -375,17 +375,6 @@ class Target_i386 : public Target_freebs
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_
// 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_
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);
Index: gold/options.h
===================================================================
RCS file: /cvs/src/src/gold/options.h,v
retrieving revision 1.107
diff -u -p -r1.107 options.h
--- gold/options.h 18 Sep 2009 20:02:21 -0000 1.107
+++ gold/options.h 1 Oct 2009 00:15:38 -0000
@@ -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);
Index: gold/powerpc.cc
===================================================================
RCS file: /cvs/src/src/gold/powerpc.cc,v
retrieving revision 1.13
diff -u -p -r1.13 powerpc.cc
--- gold/powerpc.cc 22 Jun 2009 06:51:53 -0000 1.13
+++ gold/powerpc.cc 1 Oct 2009 00:15:38 -0000
@@ -284,17 +284,6 @@ class Target_powerpc : public Sized_targ
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::
// 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::
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,
Index: gold/sparc.cc
===================================================================
RCS file: /cvs/src/src/gold/sparc.cc,v
retrieving revision 1.17
diff -u -p -r1.17 sparc.cc
--- gold/sparc.cc 22 Jun 2009 06:51:53 -0000 1.17
+++ gold/sparc.cc 1 Oct 2009 00:15:38 -0000
@@ -305,17 +305,6 @@ class Target_sparc : public Sized_target
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::gl
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::gl
// 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);
Index: gold/symtab.h
===================================================================
RCS file: /cvs/src/src/gold/symtab.h,v
retrieving revision 1.90
diff -u -p -r1.90 symtab.h
--- gold/symtab.h 5 Aug 2009 20:51:56 -0000 1.90
+++ gold/symtab.h 1 Oct 2009 00:15:38 -0000
@@ -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.
Index: gold/x86_64.cc
===================================================================
RCS file: /cvs/src/src/gold/x86_64.cc,v
retrieving revision 1.85
diff -u -p -r1.85 x86_64.cc
--- gold/x86_64.cc 7 Aug 2009 18:29:53 -0000 1.85
+++ gold/x86_64.cc 1 Oct 2009 00:15:38 -0000
@@ -375,17 +375,6 @@ class Target_x86_64 : public Target_free
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 Genera
// 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 Genera
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);
More information about the Binutils
mailing list