[PATCH 01/17] ld/PE: adjust .reloc and .edata section flags
Richard Earnshaw (lists)
Richard.Earnshaw@arm.com
Wed Aug 6 11:59:14 GMT 2025
On 04/08/2025 10:13, Jan Beulich wrote:
> Both really want to be SEC_DATA, even if _bfd_XXi_swap_scnhdr_out()
> makes sure that IMAGE_SCN_CNT_INITIALIZED_DATA is set in the final
> section header. Otoh, .reloc - being IMAGE_SCN_MEM_DISCARDABLE at least
> by default - shouldn't have SEC_ALLOC set.
>
> In an early form of the patch I also dropped SEC_ALLOC for .reloc. While
> I've undone that, I think the then necessary testsuite adjustments still
> want retaining:
>
> 1) I can't explain why the removal of _both_ SEC_ALLOC and SEC_LOAD for
> .reloc causes ld-scripts/provide-8 to XPASS on PE targets. Placing a
> symbol outside of the image isn't well-defined in PE anyway though, so
> convert the xfail-s to notarget-s.
>
> 2) Similarly it's not quite clear why ld-pe/pe-aarch64 fails due to the
> SEC_LOAD removal; the expectation of ___tls_end__ where _start should
> appear was pretty likely bogus, though. If, due to multiple symbols
> sitting at the same address, unpredictable behavior can result, the
> expectation needs to be relaxed accordingly. Assuming it's random what
> the disassembler picks, allow (about) any symbol to appear there, as
> further symbols are at the same address as per the symbol table.
Agreed. Perhaps in this case we could change the source slightly too, to have:
.section .text
+ nop // Ensure no other symbol can alias _start
_start:
mov x1, 20
b foo
foo:
ret
The nop would ensure that the expected symbol would always appear, though we'd need to adjust the .d file accordingly. Can we also use '.type' on PE files to make sure _start is correctly typed as a code symbol; or .global? Both of these would probably preference the disassembler towards using that symbol rather than some other with the same value.
R.
> ---
> #skip may be better than #notarget, except that binutils-common.exp
> demands that it only be used "in groups", which isn't the case here.
>
> --- a/ld/pe-dll.c
> +++ b/ld/pe-dll.c
> @@ -1081,6 +1081,7 @@ build_filler_bfd (bool include_edata)
> edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
> if (edata_s == NULL
> || !bfd_set_section_flags (edata_s, (SEC_HAS_CONTENTS
> + | SEC_DATA
> | SEC_ALLOC
> | SEC_LOAD
> | SEC_KEEP
> @@ -1095,7 +1096,7 @@ build_filler_bfd (bool include_edata)
> reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
> if (reloc_s == NULL
> || !bfd_set_section_flags (reloc_s, (SEC_HAS_CONTENTS
> - | SEC_ALLOC
> + | SEC_DATA
> | SEC_LOAD
> | SEC_KEEP
> | SEC_IN_MEMORY)))
> --- a/ld/testsuite/ld-pe/pe-aarch64.d
> +++ b/ld/testsuite/ld-pe/pe-aarch64.d
> @@ -6,7 +6,7 @@
>
> Disassembly of section .text:
>
> -0000000140001000 <___tls_end__>:
> +0000000140001000 <_.*>:
> 140001000: d2800281 mov x1, #0x14 // #20
> 140001004: 14000001 b 140001008 <foo>
>
> --- a/ld/testsuite/ld-scripts/provide-8.d
> +++ b/ld/testsuite/ld-scripts/provide-8.d
> @@ -1,7 +1,8 @@
> #source: provide-5.s
> #ld: -T provide-8.t
> #nm: -B
> -#xfail: mmix-*-* *-*-pe spu-*-* *-*-mingw* *-*-cygwin
> +#xfail: mmix-*-* spu-*-*
> +#notarget: *-*-pe *-*-mingw* *-*-cygwin
>
> #...
> 0+4000 D __FOO
>
More information about the Binutils
mailing list