]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
IBM zSystems: Rewrite l(g)rl @GOTENT to larl for --no-pie
authorIlya Leoshkevich <iii@linux.ibm.com>
Mon, 10 Jun 2024 13:33:48 +0000 (15:33 +0200)
committerIlya Leoshkevich <iii@linux.ibm.com>
Mon, 10 Jun 2024 20:37:06 +0000 (22:37 +0200)
Regtested on s390x-redhat-linux.

Rewriting l(g)rl @GOTENT to larl is unnecessarily guarded by
bfd_link_pic().  There were no use cases for this in the past, but
since recently the Linux Kernel on s390x is compiled with -fPIE
and linked with --no-pie.  Remove the unnecessary bfd_link_pic()
check.

bfd/ChangeLog:

        * elf32-s390.c (elf_s390_relocate_section): Don't check for
bfd_link_pic() when rewriting lrl@GOTENT to larl.
(elf_s390_finish_dynamic_symbol): Emit a relative reloc for
the above case.
        * elf64-s390.c (elf_s390_relocate_section): Don't check for
bfd_link_pic() when rewriting lgrl@GOTENT to larl.
(elf_s390_finish_dynamic_symbol): Emit a relative reloc for
the above case.

ld/ChangeLog:

* testsuite/ld-s390/s390.exp: Hook up the new tests.
        * testsuite/ld-s390/gotreloc_31-no-pie-1.dd: New test.
        * testsuite/ld-s390/gotreloc_64-no-pie-1.dd: New test.

bfd/elf32-s390.c
bfd/elf64-s390.c
ld/testsuite/ld-s390/gotreloc_31-no-pie-1.dd [new file with mode: 0644]
ld/testsuite/ld-s390/gotreloc_64-no-pie-1.dd [new file with mode: 0644]
ld/testsuite/ld-s390/s390.exp

index 2b97b7d2aecd6704e1eb9be9fb04cf15a5625ba8..702b0239dd556d1d897c2e4c0ad0c2f9d7054a0f 100644 (file)
@@ -2236,8 +2236,7 @@ elf_s390_relocate_section (bfd *output_bfd,
              else if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
                                                          bfd_link_pic (info),
                                                          h)
-                      || (bfd_link_pic (info)
-                          && SYMBOL_REFERENCES_LOCAL (info, h))
+                      || SYMBOL_REFERENCES_LOCAL (info, h)
                       || resolved_to_zero)
                {
                  /* This is actually a static link, or it is a
@@ -2262,7 +2261,6 @@ elf_s390_relocate_section (bfd *output_bfd,
                    }
 
                  if ((h->def_regular
-                      && bfd_link_pic (info)
                       && SYMBOL_REFERENCES_LOCAL (info, h))
                      /* lrl rx,sym@GOTENT -> larl rx, sym */
                      && ((r_type == R_390_GOTENT
@@ -3492,8 +3490,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
              return true;
            }
        }
-      else if (bfd_link_pic (info)
-              && SYMBOL_REFERENCES_LOCAL (info, h))
+      else if (SYMBOL_REFERENCES_LOCAL (info, h))
        {
          if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
            return true;
index d3b6e17ed6469c395a4b23e4dc10436a9e833550..05dd4e80c6b392bc0d23981a4ea1941518c1ec28 100644 (file)
@@ -2222,8 +2222,7 @@ elf_s390_relocate_section (bfd *output_bfd,
              else if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
                                                          bfd_link_pic (info),
                                                          h)
-                      || (bfd_link_pic (info)
-                          && SYMBOL_REFERENCES_LOCAL (info, h))
+                      || SYMBOL_REFERENCES_LOCAL (info, h)
                       || resolved_to_zero)
                {
                  Elf_Internal_Sym *isym;
@@ -2254,9 +2253,8 @@ elf_s390_relocate_section (bfd *output_bfd,
                     reference using larl we have to make sure that
                     the symbol is 1. properly aligned and 2. it is no
                     ABS symbol or will become one.  */
-                 if ((h->def_regular
-                      && bfd_link_pic (info)
-                      && SYMBOL_REFERENCES_LOCAL (info, h))
+                 if (h->def_regular
+                     && SYMBOL_REFERENCES_LOCAL (info, h)
                      /* lgrl rx,sym@GOTENT -> larl rx, sym */
                      && ((r_type == R_390_GOTENT
                           && (bfd_get_16 (input_bfd,
@@ -3414,8 +3412,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
              return true;
            }
        }
-      else if (bfd_link_pic (info)
-              && SYMBOL_REFERENCES_LOCAL (info, h))
+      else if (SYMBOL_REFERENCES_LOCAL (info, h))
        {
          if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
            return true;
diff --git a/ld/testsuite/ld-s390/gotreloc_31-no-pie-1.dd b/ld/testsuite/ld-s390/gotreloc_31-no-pie-1.dd
new file mode 100644 (file)
index 0000000..2e0d2cd
--- /dev/null
@@ -0,0 +1,13 @@
+
+tmpdir/gotreloc_31-1:     file format elf32-s390
+
+Disassembly of section .text:
+
+.* <foo>:
+.*:    c4 18 00 00 08 1e [      ]*lgrl %r1,4010b0 <_GLOBAL_OFFSET_TABLE_\+0x14>
+.*:    e3 10 c0 14 00 04 [      ]*lg   %r1,20\(%r12\)
+.*:    c0 10 00 00 08 1a [      ]*larl %r1,4010b4 <bar>
+.*:    58 10 c0 14 [    ]*l    %r1,20\(%r12\)
+.*:    c0 10 00 00 08 15 [      ]*larl %r1,4010b4 <bar>
+.*:    c4 18 00 00 08 0e [      ]*lgrl %r1,4010ac <_GLOBAL_OFFSET_TABLE_\+0x10>
+.*:    c4 18 00 00 08 09 [      ]*lgrl %r1,4010a8 <_GLOBAL_OFFSET_TABLE_\+0xc>
diff --git a/ld/testsuite/ld-s390/gotreloc_64-no-pie-1.dd b/ld/testsuite/ld-s390/gotreloc_64-no-pie-1.dd
new file mode 100644 (file)
index 0000000..751b7a8
--- /dev/null
@@ -0,0 +1,12 @@
+tmpdir/gotreloc_64-1:     file format elf64-s390
+
+Disassembly of section .text:
+
+.* <foo>:
+.*:    c0 10 00 00 08 2c [      ]*larl %r1,1001108 <bar>
+.*:    c0 10 00 00 08 29 [      ]*larl %r1,1001108 <bar>
+.*:    c4 1d 00 00 08 22 [      ]*lrl  %r1,1001100 <_GLOBAL_OFFSET_TABLE_\+0x28>
+.*:    58 10 c0 28 [    ]*l    %r1,40\(%r12\)
+.*:    e3 10 c0 28 00 58 [      ]*ly   %r1,40\(%r12\)
+.*:    c4 18 00 00 08 16 [      ]*lgrl %r1,10010f8 <_GLOBAL_OFFSET_TABLE_\+0x20>
+.*:    c4 18 00 00 08 0f [      ]*lgrl %r1,10010f0 <_GLOBAL_OFFSET_TABLE_\+0x18>
index 6b97b6c07d989f9c8429f8e4960568e950e82516..eb9ea35400b26f8d06b9ab235f9955b2a77c2005 100644 (file)
@@ -54,6 +54,11 @@ set s390tests {
      "-m31" {gotreloc-1.s}
      {{objdump -dzrj.text gotreloc_31-1.dd}}
      "gotreloc_31-1"}
+    {"GOT: no-pie symbol address load from got to larl"
+     "-shared -melf_s390 --no-pie --hash-style=sysv --version-script=gotreloc-1.ver" ""
+     "-m31" {gotreloc-1.s}
+     {{objdump -dzrj.text gotreloc_31-no-pie-1.dd}}
+     "gotreloc_31-1"}
 }
 
 set s390xtests {
@@ -80,6 +85,11 @@ set s390xtests {
      "-m64" {gotreloc-1.s}
      {{objdump -dzrj.text gotreloc_64-relro-1.dd}}
      "gotreloc_64-1"}
+    {"GOT: no-pie symbol address load from got to larl"
+     "-shared -melf64_s390 --no-pie --hash-style=sysv --version-script=gotreloc-1.ver" ""
+     "-m64" {gotreloc-1.s}
+     {{objdump -dzrj.text gotreloc_64-no-pie-1.dd}}
+     "gotreloc_64-1"}
     {"PLT: offset test"
      "-shared -m elf64_s390 -dT pltoffset-1.ld --no-error-rwx-segments" ""
      "-m64" {pltoffset-1.s}