Fix breakage for SHT_REL targets where get_r_addend() gives internal error.
gold/ * arm.cc (Target_arm::Classify_reloc::get_r_addend): New method. * i386.cc (Target_i386::Classify_reloc::get_r_addend): New method. * mips.cc (Target_arm::Mips_classify_reloc::get_r_addend): (Both specializations) New method.
This commit is contained in:
parent
d1193addae
commit
8a8880cb67
4 changed files with 33 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
|||
2016-01-12 Cary Coutant <ccoutant@gmail.com>
|
||||
|
||||
* arm.cc (Target_arm::Classify_reloc::get_r_addend): New method.
|
||||
* i386.cc (Target_i386::Classify_reloc::get_r_addend): New method.
|
||||
* mips.cc (Target_arm::Mips_classify_reloc::get_r_addend): (Both
|
||||
specializations) New method.
|
||||
|
||||
2016-01-11 Cary Coutant <ccoutant@gmail.com>
|
||||
|
||||
PR gold/19353
|
||||
|
|
|
@ -2749,6 +2749,14 @@ class Target_arm : public Sized_target<32, big_endian>
|
|||
public gold::Default_classify_reloc<elfcpp::SHT_REL, 32, big_endian>
|
||||
{
|
||||
public:
|
||||
typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc
|
||||
Reltype;
|
||||
|
||||
// Return the explicit addend of the relocation (return 0 for SHT_REL).
|
||||
static typename elfcpp::Elf_types<32>::Elf_Swxword
|
||||
get_r_addend(const Reltype*)
|
||||
{ return 0; }
|
||||
|
||||
// Return the size of the addend of the relocation (only used for SHT_REL).
|
||||
static unsigned int
|
||||
get_size_for_reloc(unsigned int, Relobj*);
|
||||
|
|
|
@ -743,6 +743,14 @@ class Target_i386 : public Sized_target<32, false>
|
|||
public gold::Default_classify_reloc<elfcpp::SHT_REL, 32, false>
|
||||
{
|
||||
public:
|
||||
typedef typename Reloc_types<elfcpp::SHT_REL, 32, false>::Reloc
|
||||
Reltype;
|
||||
|
||||
// Return the explicit addend of the relocation (return 0 for SHT_REL).
|
||||
static typename elfcpp::Elf_types<32>::Elf_Swxword
|
||||
get_r_addend(const Reltype*)
|
||||
{ return 0; }
|
||||
|
||||
// Return the size of the addend of the relocation (only used for SHT_REL).
|
||||
static unsigned int
|
||||
get_size_for_reloc(unsigned int, Relobj*);
|
||||
|
|
12
gold/mips.cc
12
gold/mips.cc
|
@ -2964,7 +2964,11 @@ class Mips_classify_reloc<sh_type_, 32, big_endian> :
|
|||
// Return the explicit addend of the relocation (return 0 for SHT_REL).
|
||||
static inline unsigned int
|
||||
get_r_addend(const Reltype* reloc)
|
||||
{ return Mips_reloc_types<sh_type_, 32, big_endian>::get_r_addend(reloc); }
|
||||
{
|
||||
if (sh_type_ == elfcpp::SHT_REL)
|
||||
return 0;
|
||||
return Mips_reloc_types<sh_type_, 32, big_endian>::get_r_addend(reloc);
|
||||
}
|
||||
|
||||
// Write the r_info field to a new reloc, using the r_info field from
|
||||
// the original reloc, replacing the r_sym field with R_SYM.
|
||||
|
@ -3010,7 +3014,11 @@ class Mips_classify_reloc<sh_type_, 64, big_endian> :
|
|||
// Return the explicit addend of the relocation (return 0 for SHT_REL).
|
||||
static inline typename elfcpp::Elf_types<64>::Elf_Swxword
|
||||
get_r_addend(const Reltype* reloc)
|
||||
{ return Mips_reloc_types<sh_type_, 64, big_endian>::get_r_addend(reloc); }
|
||||
{
|
||||
if (sh_type_ == elfcpp::SHT_REL)
|
||||
return 0;
|
||||
return Mips_reloc_types<sh_type_, 64, big_endian>::get_r_addend(reloc);
|
||||
}
|
||||
|
||||
// Write the r_info field to a new reloc, using the r_info field from
|
||||
// the original reloc, replacing the r_sym field with R_SYM.
|
||||
|
|
Loading…
Reference in a new issue