[PATCH 02/11] alpha: set DF_TEXTREL rather than DT_TEXTREL in info->flags

H.J. Lu hjl.tools@gmail.com
Mon Sep 7 02:02:19 GMT 2026


On Tue, Sep 1, 2026 at 10:34 AM Matt Turner <mattst88@gmail.com> wrote:
>
> elf64_alpha_calc_dynrel_sizes ORs DT_TEXTREL (22) into info->flags where
> it means DF_TEXTREL (4). The value happens to include the DF_TEXTREL
> bit, so DT_TEXTREL still appeared, but DT_FLAGS also gained DF_SYMBOLIC
> and DF_STATIC_TLS: a shared library with a text relocation against a
> global symbol was treated by the dynamic linker as if linked with
> -Bsymbolic, and dlopen of it could fail for lack of static TLS.
>
> The stray DF_STATIC_TLS also fed back into the link:
> elf64_alpha_relax_sec reads info->flags to decide that a general dynamic
> TLS reference may as well be relaxed to initial exec, so such a library
> was relaxed differently too.
>
> Present since commit fcfbdf319ee in 2001, which introduced both this and
> the correct DF_TEXTREL a few lines above it.
> ---
>  bfd/elf64-alpha.c               |  2 +-
>  ld/testsuite/ld-alpha/textrel.d |  9 +++++++++
>  ld/testsuite/ld-alpha/textrel.s | 13 +++++++++++++
>  3 files changed, 23 insertions(+), 1 deletion(-)
>  create mode 100644 ld/testsuite/ld-alpha/textrel.d
>  create mode 100644 ld/testsuite/ld-alpha/textrel.s
>
> diff --git ./bfd/elf64-alpha.c ./bfd/elf64-alpha.c
> index 4fc1a542704..a97acdc41de 100644
> --- ./bfd/elf64-alpha.c
> +++ ./bfd/elf64-alpha.c
> @@ -2667,7 +2667,7 @@ elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry *h,
>             entries * sizeof (Elf64_External_Rela) * relent->count;
>           if ((sec->flags & SEC_READONLY) != 0)
>             {
> -             info->flags |= DT_TEXTREL;
> +             info->flags |= DF_TEXTREL;

This is a real bug, independent of IFUNC.  Please open a bug
report and fix it separately.

>               info->callbacks->minfo
>                 (_("%pB: dynamic relocation against `%pT' in "
>                    "read-only section `%pA'\n"),
> diff --git ./ld/testsuite/ld-alpha/textrel.d ./ld/testsuite/ld-alpha/textrel.d
> new file mode 100644
> index 00000000000..e319ab203d3
> --- /dev/null
> +++ ./ld/testsuite/ld-alpha/textrel.d
> @@ -0,0 +1,9 @@
> +#source: textrel.s
> +#ld: -shared -melf64alpha -z notext
> +#readelf: -d
> +
> +# Only DT_TEXTREL, with no DT_FLAGS carrying the SYMBOLIC and STATIC_TLS
> +# bits of the value of DT_TEXTREL.
> +#...
> + +0x0+16 +\(TEXTREL\) +0x0
> + +0x0+0 +\(NULL\) +0x0
> diff --git ./ld/testsuite/ld-alpha/textrel.s ./ld/testsuite/ld-alpha/textrel.s
> new file mode 100644
> index 00000000000..bbd0675363d
> --- /dev/null
> +++ ./ld/testsuite/ld-alpha/textrel.s
> @@ -0,0 +1,13 @@
> +       .text
> +       .globl  _start
> +_start:
> +       ret
> +
> +       .data
> +       .globl  var
> +var:
> +       .quad   0
> +
> +       # A dynamic relocation against a global symbol in a read-only section.
> +       .section .rodata,"a",@progbits
> +       .quad   var
> --
> 2.54.0
>


-- 
H.J.


More information about the Binutils mailing list