[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