[PATCH] sparc: define _GLOBAL_OFFSET_TABLE_ when referenced
Alan Modra
amodra@gmail.com
Sat Feb 1 02:39:27 GMT 2025
On Fri, Jan 31, 2025 at 12:04:49AM -0300, Alexandre Oliva wrote:
>
> GCC testsuite gcc.dg/20050321-2.c hit link errors on undefined
> _GLOBAL_OFFSET_TABLE_. The compiler output referenced only
> _GLOBAL_OFFSET_TABLE_-offsets to set it up, and to compute the
> GOT-relative address of local symbols, none of which triggered the
> machinery that enabled the creation of the dynamic section, so
> _GLOBAL_OFFSET_TABLE_ ended up undefined.
>
> Enable the dynamic section if we find a relocation involving _G_O_T_
> that we'd otherwise ignore.
>
> Tested with --target=sparc-leon3-elf. Ok to install?
>
>
> for bfd/ChangeLog
>
> * elfxx-sparc.c (_bfd_sparc_elf_check_relocs): Create the
> got section upon finding a _GLOBAL_OFFSET_TABLE_-referencing
> relocation that we'd otherwise ignore.
>
> for ld/ChangeLog
>
> * testsuite/ld-sparc/got-def.s: New test.
> * testsuite/ld-sparc/sparc.exp: Add it.
> ---
> bfd/elfxx-sparc.c | 7 ++++++-
> ld/testsuite/ld-sparc/got-def.s | 15 +++++++++++++++
> ld/testsuite/ld-sparc/sparc.exp | 8 ++++++++
> 3 files changed, 29 insertions(+), 1 deletion(-)
> create mode 100644 ld/testsuite/ld-sparc/got-def.s
>
> diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
> index 71061621e8bfb..cec270e427acc 100644
> --- a/bfd/elfxx-sparc.c
> +++ b/bfd/elfxx-sparc.c
> @@ -1647,7 +1647,12 @@ _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
>
> if (h != NULL
> && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
> - break;
> + {
> + if (!htab->elf.sgot
> + && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
> + return false;
> + break;
> + }
Your changelog says "create the got section upon finding a _G_O_T_
referencing relocation, but that isn't what this does. It only
creates the got section for 5 particular relocations. Does the ABI
disallow _G_O_T_ on other relocations? Also, what if htab->elf.dynobj
is NULL?
See elf32-ppc.c code handling this, and note that you will only need
one strcmp against _G_O_T_ in the entire file, the one creating the
got section on seeing a reference to _G_O_T_. The rest can compare
h == htab->elf.hgot.
> /* Fall through. */
>
> case R_SPARC_DISP8:
> diff --git a/ld/testsuite/ld-sparc/got-def.s b/ld/testsuite/ld-sparc/got-def.s
> new file mode 100644
> index 0000000000000..efca9109dfcb1
> --- /dev/null
> +++ b/ld/testsuite/ld-sparc/got-def.s
> @@ -0,0 +1,15 @@
> + .text
> +.LLGETPC0:
> + retl
> + add %o7, %l7, %l7
> + .global got
> + .type got, #function
> + .proc 04
> +got:
> + save %sp, -160, %sp
> + sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
> + call .LLGETPC0
> + add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
> + mov %l7, %o0
> + ret
> + restore
> diff --git a/ld/testsuite/ld-sparc/sparc.exp b/ld/testsuite/ld-sparc/sparc.exp
> index 9d684899ee2c2..3e21ed738c443 100644
> --- a/ld/testsuite/ld-sparc/sparc.exp
> +++ b/ld/testsuite/ld-sparc/sparc.exp
> @@ -94,6 +94,10 @@ set sparctests {
> {"32-bit: TLS -fpie" "-melf32_sparc -pie tmpdir/libtlslib32.so" ""
> "--32 -K PIC" {tlspie32.s}
> {{objdump -drj.text tlspie32.dd}} "tlspie32"}
> + {"32-bit: GOT definition"
> + "-melf32_sparc" ""
> + "--32 -K PIC" {got-def.s}
> + {} "got-def"}
> {"32-bit: GOTDATA relocations"
> "-shared -melf32_sparc --hash-style=sysv" ""
> "--32 -K PIC" {gotop32.s}
> @@ -134,6 +138,10 @@ set sparc64tests {
> "-melf64_sparc -pie -Ttext-segment=0x100000 tmpdir/libtlslib64.so" ""
> "--64 -Av9 -K PIC" {tlspie64.s}
> {{objdump -drj.text tlspie64.dd}} "tlspie64"}
> + {"64-bit: GOT definition"
> + "-melf64_sparc" ""
> + "--64 -Av9 -K PIC" {got-def.s}
> + {} "got-def"}
> {"64-bit: GOTDATA relocations"
> "-shared -melf64_sparc --hash-style=sysv" ""
> "--64 -Av9 -K PIC" {gotop64.s}
>
> --
> Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/
> Free Software Activist GNU Toolchain Engineer
> More tolerance and less prejudice are key for inclusion and diversity
> Excluding neuro-others for not behaving ""normal"" is *not* inclusive
--
Alan Modra
More information about the Binutils
mailing list