aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-10-15 09:17:07 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-10-21 16:45:47 -0700
commita85711043cf5d517fd971065c946f750d7a95344 (patch)
treed13c1195567f9ecdbe06b6fbcf7f79417a1a2111
parent2d1d9ed8d3ccc8838531965557300c7b74069d8c (diff)
downloadfsf-binutils-gdb-a85711043cf5d517fd971065c946f750d7a95344.zip
fsf-binutils-gdb-a85711043cf5d517fd971065c946f750d7a95344.tar.gz
fsf-binutils-gdb-a85711043cf5d517fd971065c946f750d7a95344.tar.bz2
Gold: Don't fail on R_386_GOT32X relocation
This patch updates gold to treat the R_386_GOT32X relocation proposed in https://groups.google.com/forum/#!topic/ia32-abi/GbJJskkid4I the same as R_386_GOT32. FIXME: Gold should perform the transformations as suggested. elfcpp/ * i386.h (R_386_GOT32X): New. gold/ * i386.cc (Target_i386::Scan::get_reference_flags(): Treat R_386_GOT32X the same as R_386_GOT32. (Target_i386::Scan::local): Likewise. (Target_i386::Scan::possible_function_pointer_reloc): Likewise. (Target_i386::Scan::global): Likewise. (Target_i386::Relocate::relocate): Likewise. (Target_i386::Relocatable_size_for_reloc::get_size_for_reloc): Likewise.
-rw-r--r--elfcpp/i386.h1
-rw-r--r--gold/i386.cc6
2 files changed, 7 insertions, 0 deletions
diff --git a/elfcpp/i386.h b/elfcpp/i386.h
index 16fdef8..9d57a0f 100644
--- a/elfcpp/i386.h
+++ b/elfcpp/i386.h
@@ -86,6 +86,7 @@ enum
R_386_TLS_DESC = 41, // TLS descriptor containing pointer to code and
// to argument, returning TLS offset for symbol
R_386_IRELATIVE = 42, // Adjust indirectly by program base
+ R_386_GOT32X = 43, // 32 bit GOT entry, relaxable
// Used by Intel.
R_386_USED_BY_INTEL_200 = 200,
// GNU vtable garbage collection extensions.
diff --git a/gold/i386.cc b/gold/i386.cc
index 202f518..36c5724 100644
--- a/gold/i386.cc
+++ b/gold/i386.cc
@@ -1690,6 +1690,7 @@ Target_i386::Scan::get_reference_flags(unsigned int r_type)
return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
case elfcpp::R_386_GOT32:
+ case elfcpp::R_386_GOT32X:
// Absolute in GOT.
return Symbol::ABSOLUTE_REF;
@@ -1854,6 +1855,7 @@ Target_i386::Scan::local(Symbol_table* symtab,
break;
case elfcpp::R_386_GOT32:
+ case elfcpp::R_386_GOT32X:
{
// We need GOT section.
Output_data_got<32, false>* got = target->got_section(symtab, layout);
@@ -2105,6 +2107,7 @@ Target_i386::Scan::possible_function_pointer_reloc(unsigned int r_type)
case elfcpp::R_386_8:
case elfcpp::R_386_GOTOFF:
case elfcpp::R_386_GOT32:
+ case elfcpp::R_386_GOT32X:
{
return true;
}
@@ -2266,6 +2269,7 @@ Target_i386::Scan::global(Symbol_table* symtab,
break;
case elfcpp::R_386_GOT32:
+ case elfcpp::R_386_GOT32X:
{
// The symbol requires a GOT section.
Output_data_got<32, false>* got = target->got_section(symtab, layout);
@@ -2834,6 +2838,7 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo,
break;
case elfcpp::R_386_GOT32:
+ case elfcpp::R_386_GOT32X:
// Convert
// mov foo@GOT(%reg), %reg
// to
@@ -3617,6 +3622,7 @@ Target_i386::Relocatable_size_for_reloc::get_size_for_reloc(
case elfcpp::R_386_32:
case elfcpp::R_386_PC32:
case elfcpp::R_386_GOT32:
+ case elfcpp::R_386_GOT32X:
case elfcpp::R_386_PLT32:
case elfcpp::R_386_GOTOFF:
case elfcpp::R_386_GOTPC: