[PATCH v2] elf: Set this_idx to -1 for invalid relocations

H.J. Lu hjl.tools@gmail.com
Tue Aug 4 08:57:45 GMT 2026


On Tue, Aug 4, 2026 at 3:42 PM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 04.08.2026 00:20, H.J. Lu wrote:
> > On Mon, Aug 3, 2026 at 8:51 PM Alan Modra <amodra@gmail.com> wrote:
> >>
> >> On Mon, Aug 03, 2026 at 07:58:27AM +0800, H.J. Lu wrote:
> >>> On Mon, Aug 3, 2026 at 7:43 AM Alan Modra <amodra@gmail.com> wrote:
> >>>>
> >>>> On Sun, Aug 02, 2026 at 08:55:00AM +0800, H.J. Lu wrote:
> >>>>> On Sun, Aug 2, 2026 at 6:18 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >>>>>>
> >>>>>> When invalid relocation is reported by elf_link_read_relocs_from_section
> >>>>>> called from lang_gc_sections:
> >>>>>>
> >>>>>> ld: pr34448-bug_18.o: bad reloc symbol index (0xf2000005 >= 0x13) for
> >>>>>> offset 0x4 in section `.text.get_tls[get_tls]'
> >>>>>>
> >>>>>> the same error is reported again:
> >>>>>>
> >>>>>> ld: pr34448-bug_18.o: bad reloc symbol index (0xf2000005 >= 0x13) for
> >>>>>> offset 0x4 in section `.text.get_tls[get_tls]'
> >>>>
> >>>> Using this_idx as a flag is a bad idea.
> >>>>
> >>>> I also think that no one should be too concerned about error messages
> >>>> from fuzzed object files, so if you are going to fix this minor
> >>>> problem do so in a way that won't potentially break the linker.
> >>>>
> >>>
> >>> Then should linker stop when seeing a fuzzed object file, instead of keep
> >>> going and crash later?
> >>
> >> How is this relevant to a patch about duplicate error messages?
> >
> > If we don't care too much about fuzzed object files, why doesn't linker
> > stop when seeing them?
>
> How would you (non-heuristically, i.e. entirely reliably) tell a fuzzed object
> from a "real" one?
>
> Jan

When linker reaches the following code

      if (nsyms > 0)
        {
          if ((size_t) r_symndx >= nsyms)
            {
              _bfd_error_handler
                /* xgettext:c-format */
                (_("%pB: bad reloc symbol index (%#" PRIx64 " >= %#lx)"
                   " for offset %#" PRIx64 " in section `%pA'"),
                 abfd, (uint64_t) r_symndx, (unsigned long) nsyms,
                 (uint64_t) irela->r_offset, sec);
              elf_section_data (sec)->this_idx
                = ELF_SECTION_WITH_INVALID_RELOCATION;
              bfd_set_error (bfd_error_bad_value);
              return false;
            }
        }
      else if (r_symndx != STN_UNDEF)
        {
          _bfd_error_handler
            /* xgettext:c-format */
            (_("%pB: non-zero symbol index (%#" PRIx64 ")"
               " for offset %#" PRIx64 " in section `%pA'"
               " when the object file has no symbol table"),
             abfd, (uint64_t) r_symndx,
             (uint64_t) irela->r_offset, sec);
          elf_section_data (sec)->this_idx
            = ELF_SECTION_WITH_INVALID_RELOCATION;
          bfd_set_error (bfd_error_bad_value);
          return false;
        }

in elf_link_read_relocs_from_section, the input isn't a valid
ELF object file.   It could be a fuzzed object.

-- 
H.J.


More information about the Binutils mailing list