mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-15 05:41:49 +08:00
2010-05-28 Sterling Augustine <sterling@tensilica.com>
* elf32-xtensa.c (elf_xtensa_relocate_section): Add a large amount of code to change the bits in the instructions to match the changes in the relocations. Declare dest_addr and sym_sec to help.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2010-05-28 Sterling Augustine <sterling@tensilica.com>
|
||||||
|
|
||||||
|
* elf32-xtensa.c (elf_xtensa_relocate_section): Add a large amount
|
||||||
|
of code to change the bits in the instructions to match the changes
|
||||||
|
in the relocations. Declare dest_addr and sym_sec to help.
|
||||||
|
|
||||||
2010-05-28 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2010-05-28 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
Workaround GCC PR middle-end/4210.
|
Workaround GCC PR middle-end/4210.
|
||||||
|
@ -2672,6 +2672,9 @@ elf_xtensa_relocate_section (bfd *output_bfd,
|
|||||||
|
|
||||||
if (info->relocatable)
|
if (info->relocatable)
|
||||||
{
|
{
|
||||||
|
bfd_vma dest_addr;
|
||||||
|
asection * sym_sec = get_elf_r_symndx_section (input_bfd, r_symndx);
|
||||||
|
|
||||||
/* This is a relocatable link.
|
/* This is a relocatable link.
|
||||||
1) If the reloc is against a section symbol, adjust
|
1) If the reloc is against a section symbol, adjust
|
||||||
according to the output section.
|
according to the output section.
|
||||||
@ -2688,6 +2691,9 @@ elf_xtensa_relocate_section (bfd *output_bfd,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dest_addr = sym_sec->output_section->vma + sym_sec->output_offset
|
||||||
|
+ get_elf_r_symndx_offset (input_bfd, r_symndx) + rel->r_addend;
|
||||||
|
|
||||||
if (r_type == R_XTENSA_ASM_SIMPLIFY)
|
if (r_type == R_XTENSA_ASM_SIMPLIFY)
|
||||||
{
|
{
|
||||||
error_message = NULL;
|
error_message = NULL;
|
||||||
@ -2724,25 +2730,41 @@ elf_xtensa_relocate_section (bfd *output_bfd,
|
|||||||
to work around problems with DWARF in relocatable links
|
to work around problems with DWARF in relocatable links
|
||||||
with some previous version of BFD. Now we can't easily get
|
with some previous version of BFD. Now we can't easily get
|
||||||
rid of the hack without breaking backward compatibility.... */
|
rid of the hack without breaking backward compatibility.... */
|
||||||
if (rel->r_addend)
|
r = bfd_reloc_ok;
|
||||||
|
howto = &elf_howto_table[r_type];
|
||||||
|
if (howto->partial_inplace && rel->r_addend)
|
||||||
{
|
{
|
||||||
howto = &elf_howto_table[r_type];
|
r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
|
||||||
if (howto->partial_inplace)
|
rel->r_addend, contents,
|
||||||
|
rel->r_offset, FALSE,
|
||||||
|
&error_message);
|
||||||
|
rel->r_addend = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Put the correct bits in the target instruction, even
|
||||||
|
though the relocation will still be present in the output
|
||||||
|
file. This makes disassembly clearer, as well as
|
||||||
|
allowing loadable kernel modules to work without needing
|
||||||
|
relocations on anything other than calls and l32r's. */
|
||||||
|
|
||||||
|
/* If it is not in the same section, there is nothing we can do. */
|
||||||
|
if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP &&
|
||||||
|
sym_sec->output_section == input_section->output_section)
|
||||||
{
|
{
|
||||||
r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
|
r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
|
||||||
rel->r_addend, contents,
|
dest_addr, contents,
|
||||||
rel->r_offset, FALSE,
|
rel->r_offset, FALSE,
|
||||||
&error_message);
|
&error_message);
|
||||||
if (r != bfd_reloc_ok)
|
|
||||||
{
|
|
||||||
if (!((*info->callbacks->reloc_dangerous)
|
|
||||||
(info, error_message, input_bfd, input_section,
|
|
||||||
rel->r_offset)))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
rel->r_addend = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (r != bfd_reloc_ok)
|
||||||
|
{
|
||||||
|
if (!((*info->callbacks->reloc_dangerous)
|
||||||
|
(info, error_message, input_bfd, input_section,
|
||||||
|
rel->r_offset)))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Done with work for relocatable link; continue with next reloc. */
|
/* Done with work for relocatable link; continue with next reloc. */
|
||||||
continue;
|
continue;
|
||||||
@ -8848,6 +8870,9 @@ relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
|
|||||||
|
|
||||||
internal_relocs = retrieve_internal_relocs (abfd, sec,
|
internal_relocs = retrieve_internal_relocs (abfd, sec,
|
||||||
link_info->keep_memory);
|
link_info->keep_memory);
|
||||||
|
if (!internal_relocs && !relax_info->action_list.head)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
contents = retrieve_contents (abfd, sec, link_info->keep_memory);
|
contents = retrieve_contents (abfd, sec, link_info->keep_memory);
|
||||||
if (contents == NULL && sec_size != 0)
|
if (contents == NULL && sec_size != 0)
|
||||||
{
|
{
|
||||||
|
12
bfd/libbfd.h
12
bfd/libbfd.h
@ -2242,12 +2242,12 @@ bfd_boolean bfd_generic_merge_sections
|
|||||||
(bfd *, struct bfd_link_info *);
|
(bfd *, struct bfd_link_info *);
|
||||||
|
|
||||||
bfd_byte *bfd_generic_get_relocated_section_contents
|
bfd_byte *bfd_generic_get_relocated_section_contents
|
||||||
(bfd *abfd,
|
(bfd *,
|
||||||
struct bfd_link_info *link_info,
|
struct bfd_link_info *,
|
||||||
struct bfd_link_order *link_order,
|
struct bfd_link_order *,
|
||||||
bfd_byte *data,
|
bfd_byte *,
|
||||||
bfd_boolean relocatable,
|
bfd_boolean,
|
||||||
asymbol **symbols);
|
asymbol **);
|
||||||
|
|
||||||
/* Extracted from archures.c. */
|
/* Extracted from archures.c. */
|
||||||
extern const bfd_arch_info_type bfd_default_arch_struct;
|
extern const bfd_arch_info_type bfd_default_arch_struct;
|
||||||
|
15778
bfd/xtensa-modules.c
15778
bfd/xtensa-modules.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user