[PATCH 3/6] bfd: refine handling of relocations between debugging sections

Alan Modra amodra@gmail.com
Thu Mar 4 06:10:23 GMT 2021


On Tue, Mar 02, 2021 at 10:48:30AM +0100, Jan Beulich via Binutils wrote:
> Preliminary remark: While relevant for Dwarf in particular, I would
> assume other debug info formats have similar implications. If not, I've
> no idea how to correctly deal with the Dwarf case.
> 
> Dwarf wants references between the various .debug_* sections to be
> section relative. ELF, however, has section relative relocations on only
> very few architectures. Hence normal 32-bit / 64-bit data relocations
> get used (the ones with correspond to BFD_RELOC_{32,64}). For ELF output
> this is not a problem by default as all these sections get placed at VA
> zero. For PE output using VA 0 is not an option, as that would place the
> section below the image base (see also "bfd: don't silently wrap or
> truncate PE image section RVAs"). And even for ELF output this can be a
> problem if these sections get assigned real VAs, e.g. when a program or
> library wants to be able to access its own debug info.

So this is for linking ELF with debug info into PE output?

> For 32-bit relocations, relocation overflows would be reported if the
> image base isn't small enough, while for 64-bit relocations bad output
> (not a section relative value) would silently be generated.
> 
> Therefore the section VMA may not be used when determining the output
> base for such relocations. Since this is a heuristic, quite a bit of
> extra checking is being applied to make sure only the very few affected
> relocation types get processed this way.
> 
> bfd/
> 2021-02-XX  Jan Beulich  <jbeulich@suse.com>
> 
> 	* reloc.c (bfd_perform_relocation): Force output base to zero
> 	for relocations between debugging sections.
> 
> --- a/bfd/reloc.c
> +++ b/bfd/reloc.c
> @@ -749,6 +749,30 @@ bfd_perform_relocation (bfd *abfd,
>    else
>      output_base = reloc_target_output_section->vma;
>  
> +  /* Most architectures have no section relative ELF relocations.  They use
> +     ordinary ones instead for representing section relative references between
> +     debugging sections, which works fine as long as the section VMA gets set
> +     to zero.  While this is the default for ELF output (albeit not a
> +     requirement), in particular PE doesn't even allow zero VMAs for any of the
> +     sections.  */
> +  if(output_base && !howto->pc_relative
> +     && bfd_get_flavour (abfd) == bfd_target_elf_flavour
> +     && (reloc_target_output_section->flags
> +	 & input_section->flags & SEC_DEBUGGING))
> +    {
> +      /* Since this is a heuristic, apply further checks in an attempt to
> +	 exclude relocation types other than simple base ones.  */
> +      unsigned int size = bfd_get_reloc_size (howto);
> +
> +      if (size && !(size & (size - 1))
> +          && !(howto->bitsize & (howto->bitsize - 1))
> +          && !howto->bitpos && !howto->rightshift
> +          && !howto->negate && !howto->partial_inplace
> +          && !(howto->src_mask & (howto->src_mask + 1))
> +          && !(howto->dst_mask & (howto->dst_mask + 1)))
> +	output_base = 0;
> +    }
> +
>    output_base += symbol->section->output_offset;
>  
>    /* If symbol addresses are in octets, convert to bytes.  */

When we need this sort of horrible hack, it's time to redesign.

-- 
Alan Modra
Australia Development Lab, IBM


More information about the Binutils mailing list