mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-19 17:18:24 +08:00
Modernise _bfd_elf_mips_get_relocated_section_contents
In particular, bfd_get_full_section_contents rather than bfd_get_section_contents so that compressed sections are handled properly. Necessary for mips if objdump is to not cache debug sections. * elfxx-mips.c (_bfd_elf_mips_get_relocated_section_contents): Apply all fixes to bfd_generic_get_relocated_section_contents since this function was split out.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2021-02-14 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* elfxx-mips.c (_bfd_elf_mips_get_relocated_section_contents): Apply
|
||||||
|
all fixes to bfd_generic_get_relocated_section_contents since this
|
||||||
|
function was split out.
|
||||||
|
|
||||||
2021-02-11 Alan Modra <amodra@gmail.com>
|
2021-02-11 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* config.bfd: Remove ia64 from obsolete list.
|
* config.bfd: Remove ia64 from obsolete list.
|
||||||
|
114
bfd/elfxx-mips.c
114
bfd/elfxx-mips.c
@ -13216,26 +13216,29 @@ _bfd_elf_mips_get_relocated_section_contents
|
|||||||
bfd_boolean relocatable,
|
bfd_boolean relocatable,
|
||||||
asymbol **symbols)
|
asymbol **symbols)
|
||||||
{
|
{
|
||||||
/* Get enough memory to hold the stuff */
|
|
||||||
bfd *input_bfd = link_order->u.indirect.section->owner;
|
bfd *input_bfd = link_order->u.indirect.section->owner;
|
||||||
asection *input_section = link_order->u.indirect.section;
|
asection *input_section = link_order->u.indirect.section;
|
||||||
bfd_size_type sz;
|
long reloc_size;
|
||||||
|
arelent **reloc_vector;
|
||||||
long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
|
|
||||||
arelent **reloc_vector = NULL;
|
|
||||||
long reloc_count;
|
long reloc_count;
|
||||||
|
|
||||||
|
reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
|
||||||
if (reloc_size < 0)
|
if (reloc_size < 0)
|
||||||
goto error_return;
|
return NULL;
|
||||||
|
|
||||||
reloc_vector = bfd_malloc (reloc_size);
|
/* Read in the section. */
|
||||||
if (reloc_vector == NULL && reloc_size != 0)
|
if (!bfd_get_full_section_contents (input_bfd, input_section, &data))
|
||||||
goto error_return;
|
return NULL;
|
||||||
|
|
||||||
/* read in the section */
|
if (data == NULL)
|
||||||
sz = input_section->rawsize ? input_section->rawsize : input_section->size;
|
return NULL;
|
||||||
if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
|
|
||||||
goto error_return;
|
if (reloc_size == 0)
|
||||||
|
return data;
|
||||||
|
|
||||||
|
reloc_vector = (arelent **) bfd_malloc (reloc_size);
|
||||||
|
if (reloc_vector == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
reloc_count = bfd_canonicalize_reloc (input_bfd,
|
reloc_count = bfd_canonicalize_reloc (input_bfd,
|
||||||
input_section,
|
input_section,
|
||||||
@ -13292,26 +13295,69 @@ _bfd_elf_mips_get_relocated_section_contents
|
|||||||
gp_found = 0;
|
gp_found = 0;
|
||||||
}
|
}
|
||||||
/* end mips */
|
/* end mips */
|
||||||
|
|
||||||
for (parent = reloc_vector; *parent != NULL; parent++)
|
for (parent = reloc_vector; *parent != NULL; parent++)
|
||||||
{
|
{
|
||||||
char *error_message = NULL;
|
char *error_message = NULL;
|
||||||
|
asymbol *symbol;
|
||||||
bfd_reloc_status_type r;
|
bfd_reloc_status_type r;
|
||||||
|
|
||||||
|
symbol = *(*parent)->sym_ptr_ptr;
|
||||||
|
/* PR ld/19628: A specially crafted input file
|
||||||
|
can result in a NULL symbol pointer here. */
|
||||||
|
if (symbol == NULL)
|
||||||
|
{
|
||||||
|
link_info->callbacks->einfo
|
||||||
|
/* xgettext:c-format */
|
||||||
|
(_("%X%P: %pB(%pA): error: relocation for offset %V has no value\n"),
|
||||||
|
abfd, input_section, (* parent)->address);
|
||||||
|
goto error_return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Zap reloc field when the symbol is from a discarded
|
||||||
|
section, ignoring any addend. Do the same when called
|
||||||
|
from bfd_simple_get_relocated_section_contents for
|
||||||
|
undefined symbols in debug sections. This is to keep
|
||||||
|
debug info reasonably sane, in particular so that
|
||||||
|
DW_FORM_ref_addr to another file's .debug_info isn't
|
||||||
|
confused with an offset into the current file's
|
||||||
|
.debug_info. */
|
||||||
|
if ((symbol->section != NULL && discarded_section (symbol->section))
|
||||||
|
|| (symbol->section == bfd_und_section_ptr
|
||||||
|
&& (input_section->flags & SEC_DEBUGGING) != 0
|
||||||
|
&& link_info->input_bfds == link_info->output_bfd))
|
||||||
|
{
|
||||||
|
bfd_vma off;
|
||||||
|
static reloc_howto_type none_howto
|
||||||
|
= HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL,
|
||||||
|
"unused", FALSE, 0, 0, FALSE);
|
||||||
|
|
||||||
|
off = ((*parent)->address
|
||||||
|
* bfd_octets_per_byte (input_bfd, input_section));
|
||||||
|
_bfd_clear_contents ((*parent)->howto, input_bfd,
|
||||||
|
input_section, data, off);
|
||||||
|
(*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||||
|
(*parent)->addend = 0;
|
||||||
|
(*parent)->howto = &none_howto;
|
||||||
|
r = bfd_reloc_ok;
|
||||||
|
}
|
||||||
|
|
||||||
/* Specific to MIPS: Deal with relocation types that require
|
/* Specific to MIPS: Deal with relocation types that require
|
||||||
knowing the gp of the output bfd. */
|
knowing the gp of the output bfd. */
|
||||||
asymbol *sym = *(*parent)->sym_ptr_ptr;
|
|
||||||
|
|
||||||
/* If we've managed to find the gp and have a special
|
/* If we've managed to find the gp and have a special
|
||||||
function for the relocation then go ahead, else default
|
function for the relocation then go ahead, else default
|
||||||
to the generic handling. */
|
to the generic handling. */
|
||||||
if (gp_found
|
else if (gp_found
|
||||||
&& (*parent)->howto->special_function
|
&& ((*parent)->howto->special_function
|
||||||
== _bfd_mips_elf32_gprel16_reloc)
|
== _bfd_mips_elf32_gprel16_reloc))
|
||||||
r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
|
r = _bfd_mips_elf_gprel16_with_gp (input_bfd, symbol, *parent,
|
||||||
input_section, relocatable,
|
input_section, relocatable,
|
||||||
data, gp);
|
data, gp);
|
||||||
else
|
else
|
||||||
r = bfd_perform_relocation (input_bfd, *parent, data,
|
r = bfd_perform_relocation (input_bfd,
|
||||||
|
*parent,
|
||||||
|
data,
|
||||||
input_section,
|
input_section,
|
||||||
relocatable ? abfd : NULL,
|
relocatable ? abfd : NULL,
|
||||||
&error_message);
|
&error_message);
|
||||||
@ -13320,7 +13366,7 @@ _bfd_elf_mips_get_relocated_section_contents
|
|||||||
{
|
{
|
||||||
asection *os = input_section->output_section;
|
asection *os = input_section->output_section;
|
||||||
|
|
||||||
/* A partial link, so keep the relocs */
|
/* A partial link, so keep the relocs. */
|
||||||
os->orelocation[os->reloc_count] = *parent;
|
os->orelocation[os->reloc_count] = *parent;
|
||||||
os->reloc_count++;
|
os->reloc_count++;
|
||||||
}
|
}
|
||||||
@ -13348,14 +13394,40 @@ _bfd_elf_mips_get_relocated_section_contents
|
|||||||
input_bfd, input_section, (*parent)->address);
|
input_bfd, input_section, (*parent)->address);
|
||||||
break;
|
break;
|
||||||
case bfd_reloc_outofrange:
|
case bfd_reloc_outofrange:
|
||||||
|
/* PR ld/13730:
|
||||||
|
This error can result when processing some partially
|
||||||
|
complete binaries. Do not abort, but issue an error
|
||||||
|
message instead. */
|
||||||
|
link_info->callbacks->einfo
|
||||||
|
/* xgettext:c-format */
|
||||||
|
(_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
|
||||||
|
abfd, input_section, * parent);
|
||||||
|
goto error_return;
|
||||||
|
|
||||||
|
case bfd_reloc_notsupported:
|
||||||
|
/* PR ld/17512
|
||||||
|
This error can result when processing a corrupt binary.
|
||||||
|
Do not abort. Issue an error message instead. */
|
||||||
|
link_info->callbacks->einfo
|
||||||
|
/* xgettext:c-format */
|
||||||
|
(_("%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"),
|
||||||
|
abfd, input_section, * parent);
|
||||||
|
goto error_return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
abort ();
|
/* PR 17512; file: 90c2a92e.
|
||||||
|
Report unexpected results, without aborting. */
|
||||||
|
link_info->callbacks->einfo
|
||||||
|
/* xgettext:c-format */
|
||||||
|
(_("%X%P: %pB(%pA): relocation \"%pR\" returns an unrecognized value %x\n"),
|
||||||
|
abfd, input_section, * parent, r);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free (reloc_vector);
|
free (reloc_vector);
|
||||||
return data;
|
return data;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user