ELF DWARF in PE output

* elf.c (bfd_elf_generic_reloc): Make references between debug
	sections use section relative values.
This commit is contained in:
Alan Modra 2021-03-06 21:56:15 +10:30
parent ccdc02ed07
commit 2dfa8341e0
2 changed files with 21 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2021-03-10 Alan Modra <amodra@gmail.com>
Jan Beulich <jbeulich@suse.com>
* elf.c (bfd_elf_generic_reloc): Make references between debug
sections use section relative values.
2021-03-09 Jan Beulich <jbeulich@suse.com>
* peXXigen.c (_bfd_XXi_swap_scnhdr_out): Diagnose out of range RVA.

View File

@ -1302,8 +1302,7 @@ const char *const bfd_elf_section_type_names[] =
change anything about the way the reloc is handled, since it will
all be done at final link time. Rather than put special case code
into bfd_perform_relocation, all the reloc types use this howto
function. It just short circuits the reloc if producing
relocatable output against an external symbol. */
function, or should call this function for relocatable output. */
bfd_reloc_status_type
bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
@ -1323,6 +1322,20 @@ bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
return bfd_reloc_ok;
}
/* In some cases the relocation should be treated as output section
relative, as when linking ELF DWARF into PE COFF. Many ELF
targets lack section relative relocations and instead use
ordinary absolute relocations for references between DWARF
sections. That is arguably a bug in those targets but it happens
to work for the usual case of linking to non-loaded ELF debug
sections with VMAs forced to zero. PE COFF on the other hand
doesn't allow a section VMA of zero. */
if (output_bfd == NULL
&& !reloc_entry->howto->pc_relative
&& (symbol->section->flags & SEC_DEBUGGING) != 0
&& (input_section->flags & SEC_DEBUGGING) != 0)
reloc_entry->addend -= symbol->section->output_section->vma;
return bfd_reloc_continue;
}