diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-10-22 04:54:42 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-10-22 04:56:49 -0700 |
commit | 493d4b48decc2b3c5fe9d2df68bcee67fdd8b7cb (patch) | |
tree | eee71acf168acd099a56d4e57a353d64734683e1 | |
parent | caa65211bbbfd53c40c9ce1b79b97ccf2c679a52 (diff) | |
download | gdb-493d4b48decc2b3c5fe9d2df68bcee67fdd8b7cb.zip gdb-493d4b48decc2b3c5fe9d2df68bcee67fdd8b7cb.tar.gz gdb-493d4b48decc2b3c5fe9d2df68bcee67fdd8b7cb.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/ChangeLog | 4 | ||||
-rw-r--r-- | elfcpp/i386.h | 1 | ||||
-rw-r--r-- | gold/ChangeLog | 11 | ||||
-rw-r--r-- | gold/i386.cc | 6 |
4 files changed, 22 insertions, 0 deletions
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog index 18c1d5a..c0f1698 100644 --- a/elfcpp/ChangeLog +++ b/elfcpp/ChangeLog @@ -1,3 +1,7 @@ +2015-10-22 H.J. Lu <hongjiu.lu@intel.com> + + * i386.h (R_386_GOT32X): New. + 2015-10-13 H.J. Lu <hongjiu.lu@intel.com> PR gold/19118 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/ChangeLog b/gold/ChangeLog index a3d0571..c0af029 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,14 @@ +2015-10-22 H.J. Lu <hongjiu.lu@intel.com> + + * 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. + 2015-10-20 H.J. Lu <hongjiu.lu@intel.com> * testsuite/Makefile.am (x86_64_mov_to_lea11): Replace 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: |