mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-10 23:57:03 +08:00
Properly handle R_X86_64_32 for x32
2012-01-10 H.J. Lu <hongjiu.lu@intel.com> * x86_64.cc (Scan::check_non_pic): Allow R_X86_64_32 for x32. (Scan::local): Use R_X86_64_RELATIVE relocation for R_X86_64_32 under x32.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2012-01-10 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* x86_64.cc (Scan::check_non_pic): Allow R_X86_64_32 for x32.
|
||||||
|
(Scan::local): Use R_X86_64_RELATIVE relocation for R_X86_64_32
|
||||||
|
under x32.
|
||||||
|
|
||||||
2012-01-09 H.J. Lu <hongjiu.lu@intel.com>
|
2012-01-09 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* x86_64.cc: Initial support for x32.
|
* x86_64.cc: Initial support for x32.
|
||||||
|
@ -1971,6 +1971,9 @@ Target_x86_64<size>::Scan::check_non_pic(Relobj* object, unsigned int r_type,
|
|||||||
return;
|
return;
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case elfcpp::R_X86_64_32:
|
case elfcpp::R_X86_64_32:
|
||||||
|
// R_X86_64_32 is OK for x32.
|
||||||
|
if (size == 32 && r_type == elfcpp::R_X86_64_32)
|
||||||
|
return;
|
||||||
if (this->issued_non_pic_error_)
|
if (this->issued_non_pic_error_)
|
||||||
return;
|
return;
|
||||||
gold_assert(parameters->options().output_is_position_independent());
|
gold_assert(parameters->options().output_is_position_independent());
|
||||||
@ -2079,6 +2082,19 @@ Target_x86_64<size>::Scan::local(Symbol_table* symtab,
|
|||||||
// because that is always a 64-bit relocation.
|
// because that is always a 64-bit relocation.
|
||||||
if (parameters->options().output_is_position_independent())
|
if (parameters->options().output_is_position_independent())
|
||||||
{
|
{
|
||||||
|
// Use R_X86_64_RELATIVE relocation for R_X86_64_32 under x32.
|
||||||
|
if (size == 32 && r_type == elfcpp::R_X86_64_32)
|
||||||
|
{
|
||||||
|
unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
|
||||||
|
Reloc_section* rela_dyn = target->rela_dyn_section(layout);
|
||||||
|
rela_dyn->add_local_relative(object, r_sym,
|
||||||
|
elfcpp::R_X86_64_RELATIVE,
|
||||||
|
output_section, data_shndx,
|
||||||
|
reloc.get_r_offset(),
|
||||||
|
reloc.get_r_addend(), is_ifunc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
this->check_non_pic(object, r_type, NULL);
|
this->check_non_pic(object, r_type, NULL);
|
||||||
|
|
||||||
Reloc_section* rela_dyn = target->rela_dyn_section(layout);
|
Reloc_section* rela_dyn = target->rela_dyn_section(layout);
|
||||||
|
Reference in New Issue
Block a user