Re: [PATCH] elf: Avoid relocating non-allocated code sections

Jan Beulich <[email protected]> Thu, 30 Jul 2026 13:21:34 +0200
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
On 30.07.2026 12:48, H.J. Lu wrote:
> On Thu, Jul 30, 2026 at 2:57 PM Jan Beulich <[email protected]> wrote:
>> On 30.07.2026 02:33, H.J. Lu wrote:
>>> Since non-allocated code sections can't be properly relocated, issue an
>>> error on such input.
>>>
>>> PR ld/34444
>>> * elflink.c (elf_link_input_bfd): Issue an error on a non-allocated
>>> code section.
>>
>> In addition to what Alan said - why would text sections be different here?
>> Iirc this isn't the first time that you want to treat them specially when
>> there's no provision for that in the spec. Once that restriction was
>> removed, I expect your check would trigger on e.g. debugging sections,
>> indicating that it's wrong to have.
>>
>> Jan
> 
> _bfd_elf_link_iterate_on_relocs has
> 
>      for (o = abfd->sections; o != NULL; o = o->next)
>         {
>           Elf_Internal_Rela *internal_relocs;
>           bool ok;
> 
>           /* Don't check relocations in excluded sections.  Don't do
>              anything special with non-loaded, non-alloced sections.
>              In particular, any relocs in such sections should not
>              affect GOT and PLT reference counting (ie.  we don't
>              allow them to create GOT or PLT entries), there's no
>              possibility or desire to optimize TLS relocs, and
>              there's not much point in propagating relocs to shared
>              libs that the dynamic linker won't relocate.  */
>           if ((o->flags & SEC_ALLOC) == 0
>               || (o->flags & SEC_RELOC) == 0
>               || (o->flags & SEC_EXCLUDE) != 0
>               || o->reloc_count == 0
>               || ((info->strip == strip_all || info->strip == strip_debugger)
>                   && (o->flags & SEC_DEBUGGING) != 0)
>               || bfd_is_abs_section (o->output_section))
>             continue;
> 
>           internal_relocs = _bfd_elf_link_info_read_relocs
>             (abfd, info, o, NULL, NULL,
>              _bfd_elf_link_keep_memory (info));
>           if (internal_relocs == NULL)
>             return false;
> 
>           ok = action (abfd, info, o, internal_relocs);
> 
> When non-alloced sections use GOT or PLT,  their
> usages aren't counted.   Then elf_link_input_bfd
> calls relocate_section on these sections.   When
> x86 backend tries to use GOT or PLT to resolve
> relocations in non-alloced sections, everything goes
> downhill from there.

So that may be where a correction is needed then.

>    This patch:
> 
> diff --git a/bfd/elflink.c b/bfd/elflink.c
> index 0af9837a28c..13eddee672a 100644
> --- a/bfd/elflink.c
> +++ b/bfd/elflink.c
> @@ -4299,8 +4299,7 @@ _bfd_elf_link_iterate_on_relocs
>         possibility or desire to optimize TLS relocs, and
>         there's not much point in propagating relocs to shared
>         libs that the dynamic linker won't relocate.  */
> -    if ((o->flags & SEC_ALLOC) == 0
> -        || (o->flags & SEC_RELOC) == 0
> +    if ((o->flags & SEC_RELOC) == 0
>          || (o->flags & SEC_EXCLUDE) != 0
>          || o->reloc_count == 0
>          || ((info->strip == strip_all || info->strip == strip_debugger)
> 
> avoids the crash.  But I don't think it is correct.

Indeed.

Jan