]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86: Don't check R_386_NONE nor R_X86_64_NONE
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 9 Jan 2024 14:30:28 +0000 (06:30 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 9 Jan 2024 14:39:42 +0000 (06:39 -0800)
Update x86 ELF linker to skip R_386_NONE/R_X86_64_NONE when scanning
relocations.

bfd/

* PR ld/31047
* elf32-i386.c (elf_i386_scan_relocs): Don't check R_386_NONE.
* elf64-x86-64.c (elf_x86_64_scan_relocs): Don't check
R_X86_64_NONE.

ld/

* PR ld/31047
* testsuite/ld-i386/i386.exp: Run PR ld/31047 test.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/pr31047.d: New file.
* testsuite/ld-x86-64/pr31047-x32.d: Likewise.
* testsuite/ld-x86-64/pr31047.d: Likewise.
* testsuite/ld-x86-64/pr31047a.s: Likewise.
* testsuite/ld-x86-64/pr31047b.s: Likewise.

bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr31047.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr31047-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr31047.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr31047a.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr31047b.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 5fc68551e95edadc2a6362f02e8effa6a95f5422..e2f88a114879c629e4d02bf0baa94b408475eb39 100644 (file)
@@ -1525,6 +1525,10 @@ elf_i386_scan_relocs (bfd *abfd,
       r_symndx = ELF32_R_SYM (rel->r_info);
       r_type = ELF32_R_TYPE (rel->r_info);
 
+      /* Don't check R_386_NONE.  */
+      if (r_type == R_386_NONE)
+       continue;
+
       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
        {
          /* xgettext:c-format */
index ec001599cc19a12f1f3da68848016783199c3739..f8905fbd4d4d399df0e4102e913cf0a4f90b4d84 100644 (file)
@@ -2040,6 +2040,10 @@ elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info,
       r_symndx = htab->r_sym (rel->r_info);
       r_type = ELF32_R_TYPE (rel->r_info);
 
+      /* Don't check R_X86_64_NONE.  */
+      if (r_type == R_X86_64_NONE)
+       continue;
+
       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
        {
          /* xgettext:c-format */
index c7df7731ac413bcf5557385562e6c805511ac992..18d1c9198ca9266c5cc9e19248f8d244293ed5c6 100644 (file)
@@ -512,6 +512,7 @@ run_dump_test "dt-relr-1b"
 run_dump_test "pr28870"
 run_dump_test "pr28894"
 run_dump_test "pr30787"
+run_dump_test "pr31047"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr31047.d b/ld/testsuite/ld-i386/pr31047.d
new file mode 100644 (file)
index 0000000..9c96d82
--- /dev/null
@@ -0,0 +1,13 @@
+#source: ../ld-x86-64/pr31047a.s
+#source: ../ld-x86-64/pr31047b.s
+#as: --32
+#ld: -pie -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+ +[a-f0-9]+:   90                      nop
diff --git a/ld/testsuite/ld-x86-64/pr31047-x32.d b/ld/testsuite/ld-x86-64/pr31047-x32.d
new file mode 100644 (file)
index 0000000..87bb92c
--- /dev/null
@@ -0,0 +1,13 @@
+#source: pr31047a.s
+#source: pr31047b.s
+#as: --x32
+#ld: -pie -melf32_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+ +[a-f0-9]+:   90                      nop
diff --git a/ld/testsuite/ld-x86-64/pr31047.d b/ld/testsuite/ld-x86-64/pr31047.d
new file mode 100644 (file)
index 0000000..5c3047c
--- /dev/null
@@ -0,0 +1,13 @@
+#source: pr31047a.s
+#source: pr31047b.s
+#as: --64
+#ld: -pie -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+ +[a-f0-9]+:   90                      nop
diff --git a/ld/testsuite/ld-x86-64/pr31047a.s b/ld/testsuite/ld-x86-64/pr31047a.s
new file mode 100644 (file)
index 0000000..9d4777e
--- /dev/null
@@ -0,0 +1,3 @@
+       .globl foo
+       foo = 0x1000
+       .section .note.GNU-stack,"",@progbits
diff --git a/ld/testsuite/ld-x86-64/pr31047b.s b/ld/testsuite/ld-x86-64/pr31047b.s
new file mode 100644 (file)
index 0000000..1f0169a
--- /dev/null
@@ -0,0 +1,6 @@
+       .text
+       .globl _start
+_start:
+       .nop
+       .reloc 0, BFD_RELOC_NONE, foo
+       .section .note.GNU-stack,"",@progbits
index 0af9f047600a518a3d4ec216a9d5b883eb87e8f1..03266cba7e05e82b8e1b974d0337e34d36d9dfb0 100644 (file)
@@ -511,6 +511,8 @@ run_dump_test "dt-relr-1a-x32"
 run_dump_test "dt-relr-1b"
 run_dump_test "dt-relr-1b-x32"
 run_dump_test "pr30787"
+run_dump_test "pr31047"
+run_dump_test "pr31047-x32"
 
 if { ![skip_sframe_tests] } {
     run_dump_test "sframe-simple-1"