aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorDavid Faust <david.faust@oracle.com>2024-01-10 15:05:36 -0800
committerDavid Faust <david.faust@oracle.com>2024-01-12 08:22:23 -0800
commitba7c1e37cfb498263a4e309700c27696fa5ff1ad (patch)
treecdd71668ca7941a1e1b173a867b09eab02cfd62d /gas
parent98138c62cd7f721af132f9b24f274332fd8bf079 (diff)
downloadgdb-ba7c1e37cfb498263a4e309700c27696fa5ff1ad.zip
gdb-ba7c1e37cfb498263a4e309700c27696fa5ff1ad.tar.gz
gdb-ba7c1e37cfb498263a4e309700c27696fa5ff1ad.tar.bz2
bpf: fix relocation addend incorrect symbol value
Relocations installed by the BPF ELF backend were sometimes incorrectly adding the symbol value to the relocation entry addend, when the correct relocation value was already stored in the addend. This could lead to a relocation effectively adding the symbol value twice. Fix that by making bpf_elf_generic_reloc () more similar to the flow of bfd_install_relocation in the case where howto->install_addend is set, which is how it ought to behave. bfd/ * bpf-reloc.def (R_BPF_64_ABS32, R_BPF_64_ABS64) (R_BPF_64_NODYLD32): Set partial_inplace to true. * elf64-bpf.c (bpf_elf_generic_reloc): Do not include the value of the symbol when installing relocation. Copy some additional logic from bfd_elf_generic_reloc. gas/ * testsuite/gas/bpf/bpf.exp: Run new test. * testsuite/gas/bpf/elf-relo-1.d: New. * testsuite/gas/bpf/elf-relo-1.s: New.
Diffstat (limited to 'gas')
-rw-r--r--gas/testsuite/gas/bpf/bpf.exp3
-rw-r--r--gas/testsuite/gas/bpf/elf-relo-1.d35
-rw-r--r--gas/testsuite/gas/bpf/elf-relo-1.s25
3 files changed, 63 insertions, 0 deletions
diff --git a/gas/testsuite/gas/bpf/bpf.exp b/gas/testsuite/gas/bpf/bpf.exp
index 44b050e..dae8bd9 100644
--- a/gas/testsuite/gas/bpf/bpf.exp
+++ b/gas/testsuite/gas/bpf/bpf.exp
@@ -83,4 +83,7 @@ if {[istarget bpf*-*-*]} {
# Test that parser does not create undefined symbols
run_dump_test asm-extra-sym-1
+
+ # Test relocation installation
+ run_dump_test elf-relo-1
}
diff --git a/gas/testsuite/gas/bpf/elf-relo-1.d b/gas/testsuite/gas/bpf/elf-relo-1.d
new file mode 100644
index 0000000..4a1c794
--- /dev/null
+++ b/gas/testsuite/gas/bpf/elf-relo-1.d
@@ -0,0 +1,35 @@
+#as: -EL -mdialect=normal
+#objdump: -tdr
+#source elf-relo-1.s
+#name: eBPF ELF relocations 1
+
+.*: +file format elf64-bpfle
+
+SYMBOL TABLE:
+0000000000000000 l d .text 0000000000000000 .text
+0000000000000000 l d .data 0000000000000000 .data
+0000000000000000 l d .bss 0000000000000000 .bss
+0000000000000006 l .data 0000000000000000 bar
+0000000000000000 l F .text 0000000000000000 baz
+0000000000000030 l F .text 0000000000000000 qux
+0000000000000004 g .data 0000000000000000 foo
+0000000000000000 \*UND\* 0000000000000000 somefunc
+
+
+
+Disassembly of section .text:
+
+0+ <baz>:
+ 0: 18 01 00 00 00 00 00 00 lddw %r1,0
+ 8: 00 00 00 00 00 00 00 00
+ 0: R_BPF_64_64 foo
+ 10: b7 02 00 00 06 00 00 00 mov %r2,6
+ 14: R_BPF_64_ABS32 .data
+ 18: 18 03 00 00 30 00 00 00 lddw %r3,48
+ 20: 00 00 00 00 00 00 00 00
+ 18: R_BPF_64_64 .text
+ 28: 85 10 00 00 ff ff ff ff call -1
+ 28: R_BPF_64_32 somefunc
+
+0+30 <qux>:
+ 30: 95 00 00 00 00 00 00 00 exit
diff --git a/gas/testsuite/gas/bpf/elf-relo-1.s b/gas/testsuite/gas/bpf/elf-relo-1.s
new file mode 100644
index 0000000..23424e0
--- /dev/null
+++ b/gas/testsuite/gas/bpf/elf-relo-1.s
@@ -0,0 +1,25 @@
+ .global foo
+ .data
+ .byte 1
+ .byte 2
+ .byte 3
+ .byte 4
+foo:
+ .byte 5
+ .byte 6
+bar:
+ .byte 7
+ .byte 8
+
+ .text
+ .align 3
+ .type baz, @function
+baz:
+ lddw %r1, foo
+ mov %r2, bar
+ lddw %r3, qux
+ call somefunc
+
+ .type qux, @function
+qux:
+ exit