[PATCH] microblaze: neutralise relocations against discarded sections

Frager, Neal neal.frager@amd.com
Thu Aug 13 04:50:01 GMT 2026


AMD General

Hello Sam,

> microblaze_elf_relocate_section does not handle relocations against
> symbols defined in sections discarded by linkonce or comdat handling.
> bfd/elf32-microblaze.c contains no RELOC_AGAINST_DISCARDED_SECTION at
> all, where 60 other bfd/elf*.c files use it.  The relocation survives and
> resolves against a dead symbol, so debug sections end up holding garbage
> where zero is expected:

>  ld-elf/linkonce2
>    regexp "^.*(NONE|unused|UNUSED).*\*ABS\*$"
>    line   "00000000 R_MICROBLAZE_32   foo"

>  ld-discard/zero-range
>    regexp "^ 0000 (01)?000000(01)? (01)?000000(01)? 00000000 00000000 .*$"
>    line   " 0000 00000000 00000002 00000000 00000000  ................"

> sym_hashes is checked for NULL as RELOC_FOR_GLOBAL_SYMBOL does, since this
> lookup runs before that macro is reached.  elf_sym_hashes is left NULL for
> an object with no global symbols, the allocation in
> elf_link_add_object_symbols being gated on extsymcount, so the check is
> not only for the malformed input its comment there mentions.

> Most backends put the check after symbol resolution and before the
> bfd_link_relocatable early exit.  This one resolves the symbol separately
> in each of two branches, and the relocatable branch returns early for
> global symbols, which is exactly the case ld-elf/linkonce2 exercises.
> The defining section is therefore looked up once before either branch,
> which covers both the final and the relocatable link without
> restructuring the function.

> microblaze_elf_howto_table is an array of pointers, and
> R_MICROBLAZE_TEXTREL_32_LO has no entry in microblaze_elf_howto_raw, so
> howto can be NULL for a type that is in range.  Relaxation creates that
> type and _bfd_clear_contents reads howto->size, so the call is guarded, as
> elf32-ppc.c guards its own array of howto pointers.  Such a relocation is
> left alone rather than neutralised, as before.

> Fixes four existing tests on microblaze-elf:

>  ld-discard/zero-range
>  ld-discard/zero-rel
>  ld-elf/linkonce1
>  ld-elf/linkonce2

> ld/testsuite goes from 476 passes and 4 unexpected failures to 480 and 0.
> gas and binutils result lists are byte-identical.  No test changes state
> in the other direction.

> bfd/
>       * elf32-microblaze.c (microblaze_elf_relocate_section): Look up
>       the section defining the symbol and neutralise relocations
>       against discarded sections, skipping relocation types with no
>       howto table entry and objects with no symbol hash table.

> Signed-off-by: Sam Price <thesamprice@gmail.com>
> Assisted-by: Claude (Anthropic)

Thank you for fixing these!

Reviewed-by: Neal Frager <neal.frager@amd.com>

Best regards,
Neal Frager
AMD



More information about the Binutils mailing list