Skip to content

Commit

Permalink
PowerPC64 treatment of absolute symbols
Browse files Browse the repository at this point in the history
Supporting -static-pie on PowerPC64 requires the linker to properly
treat SHN_ABS symbols for cases like glibc's _nl_current_LC_CTYPE_used
absolute symbol.  I've been slow to fix the linker on powerpc because
there is some chance that this will break some shared libraries or
PIEs.

bfd/
	* elf64-ppc.c (ppc64_elf_check_relocs): Consolidate local sym
	handling code.  Don't count dyn relocs against non-dynamic
	absolute symbols.
	(dec_dynrel_count): Adjust to suit.
	(ppc64_elf_edit_toc): Don't remove entries for absolute symbols
	when pic.
	(allocate_got): Don't allocate space for got relocs against
	non-dynamic absolute syms.
	(ppc64_elf_layout_multitoc): Likewise.
	(got_and_plt_relr): Likewise.
	(ppc64_elf_size_dynamic_sections): Likewise for local got.
	(got_and_plt_relr_for_local_syms): Likewise.
	(ppc64_elf_size_stubs): Don't allocate space for relr either.
	(ppc64_elf_relocate_section): Don't write relocs against non-dynamic
	absolute symbols.  Don't optimise got and toc code sequences
	loading absolute symbol entries.
ld/
	* testsuite/ld-powerpc/abs-reloc.s,
	* testsuite/ld-powerpc/abs-static.d,
	* testsuite/ld-powerpc/abs-static.r,
	* testsuite/ld-powerpc/abs-pie.d,
	* testsuite/ld-powerpc/abs-pie.r,
	* testsuite/ld-powerpc/abs-shared.d,
	* testsuite/ld-powerpc/abs-shared.r,
	* testsuite/ld-powerpc/abs-pie-relr.d,
	* testsuite/ld-powerpc/abs-pie-relr.r,
	* testsuite/ld-powerpc/abs-shared-relr.d,
	* testsuite/ld-powerpc/abs-shared-relr.r: New tests.
	* testsuite/ld-powerpc/powerpc.exp: Run them.
  • Loading branch information
amodra committed Feb 3, 2022
1 parent 36a13a0 commit 3a3a4c1
Show file tree
Hide file tree
Showing 13 changed files with 416 additions and 62 deletions.
188 changes: 126 additions & 62 deletions bfd/elf64-ppc.c

Large diffs are not rendered by default.

34 changes: 34 additions & 0 deletions ld/testsuite/ld-powerpc/abs-pie-relr.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -pie --hash-style=sysv -z pack-relative-relocs --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#objdump: -sdr

#...
Contents of section .got:
.* (00000000 00018300|00830100 00000000) (00000000 00000001|01000000 00000000) .*
.* (00000000 00000002|02000000 00000000) (12345678 9abcdef0|f0debc9a 78563412) .*
.* (00000000 00000002|02000000 00000000) (12345678 9abcdef0|f0debc9a 78563412) .*
.* (00000000 00000001|01000000 00000000) .*
Contents of section \.data:
.* (00000000 00010338|38030100 00000000) (00000000 00000001|01000000 00000000) .*
.* (00000000 00000002|02000000 00000000) (12345678 9abcdef0|f0debc9a 78563412) .*
#...
.* <_start>:
.*: (3c 4c 00 02|02 00 4c 3c) addis r2,r12,2
.*: (38 42 81 58|58 81 42 38) addi r2,r2,-32424
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 62 80 38|38 80 62 38) addi r3,r2,-32712
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 82 80 08|08 80 82 e8) ld r4,-32760\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 a2 80 10|10 80 a2 e8) ld r5,-32752\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 c2 80 18|18 80 c2 e8) ld r6,-32744\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 e2 80 38|38 80 e2 38) addi r7,r2,-32712
.*: (3d 02 00 00|00 00 02 3d) addis r8,r2,0
.*: (e9 08 80 30|30 80 08 e9) ld r8,-32720\(r8\)
.*: (3d 22 00 00|00 00 22 3d) addis r9,r2,0
.*: (e9 29 80 20|20 80 29 e9) ld r9,-32736\(r9\)
.*: (3d 42 00 00|00 00 42 3d) addis r10,r2,0
.*: (e9 4a 80 28|28 80 4a e9) ld r10,-32728\(r10\)
8 changes: 8 additions & 0 deletions ld/testsuite/ld-powerpc/abs-pie-relr.r
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -pie --hash-style=sysv -z pack-relative-relocs --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#readelf: -rW

Relocation section '\.relr\.dyn' at offset .* contains 1 entry:
1 offset
0+10338
34 changes: 34 additions & 0 deletions ld/testsuite/ld-powerpc/abs-pie.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -pie --hash-style=sysv --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#objdump: -sdr

#...
Contents of section \.got:
.* (00000000 00018400|00840100 00000000) (00000000 00000001|01000000 00000000) .*
.* (00000000 00000002|02000000 00000000) (12345678 9abcdef0|f0debc9a 78563412) .*
.* (00000000 00000002|02000000 00000000) (12345678 9abcdef0|f0debc9a 78563412) .*
.* (00000000 00000001|01000000 00000000) .*
Contents of section \.data:
.* (00000000 00010438|38040100 00000000) (00000000 00000001|01000000 00000000) .*
.* (00000000 00000002|02000000 00000000) (12345678 9abcdef0|f0debc9a 78563412) .*
#...
.* <_start>:
.*: (3c 4c 00 02|02 00 4c 3c) addis r2,r12,2
.*: (38 42 82 10|10 82 42 38) addi r2,r2,-32240
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 62 80 38|38 80 62 38) addi r3,r2,-32712
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 82 80 08|08 80 82 e8) ld r4,-32760\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 a2 80 10|10 80 a2 e8) ld r5,-32752\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 c2 80 18|18 80 c2 e8) ld r6,-32744\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 e2 80 38|38 80 e2 38) addi r7,r2,-32712
.*: (3d 02 00 00|00 00 02 3d) addis r8,r2,0
.*: (e9 08 80 30|30 80 08 e9) ld r8,-32720\(r8\)
.*: (3d 22 00 00|00 00 22 3d) addis r9,r2,0
.*: (e9 29 80 20|20 80 29 e9) ld r9,-32736\(r9\)
.*: (3d 42 00 00|00 00 42 3d) addis r10,r2,0
.*: (e9 4a 80 28|28 80 4a e9) ld r10,-32728\(r10\)
8 changes: 8 additions & 0 deletions ld/testsuite/ld-powerpc/abs-pie.r
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -pie --hash-style=sysv --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#readelf: -rW

Relocation section '\.rela\.dyn' at offset .* contains 1 entry:
+Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
0+10438 +0+16 R_PPC64_RELATIVE +10438
49 changes: 49 additions & 0 deletions ld/testsuite/ld-powerpc/abs-reloc.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
.globl x
.hidden x

.section .toc,"aw"
.p2align 3
.Lx:
.quad x
.La:
.quad a
.Lb:
.quad b
.Lc:
.quad c

.data
.p2align 3
x:
.quad x
.quad a
.quad b
.quad c

.text
.p2align 2
.globl _start
.type _start,@function
_start:
0:
addis 2,12,.TOC.-0b@ha
addi 2,2,.TOC.-0b@l
.localentry _start,.-_start
addis 3,2,.Lx@toc@ha
ld 3,.Lx@toc@l(3)
addis 4,2,.La@toc@ha
ld 4,.La@toc@l(4)
addis 5,2,.Lb@toc@ha
ld 5,.Lb@toc@l(5)
addis 6,2,.Lc@toc@ha
ld 6,.Lc@toc@l(6)

addis 7,2,x@got@ha
ld 7,x@got@l(7)
addis 8,2,a@got@ha
ld 8,a@got@l(8)
addis 9,2,b@got@ha
ld 9,b@got@l(9)
addis 10,2,c@got@ha
ld 10,c@got@l(10)
.size _start,.-_start
34 changes: 34 additions & 0 deletions ld/testsuite/ld-powerpc/abs-shared-relr.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -shared --hash-style=sysv -z pack-relative-relocs --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#objdump: -sdr

#...
Contents of section \.got:
.* (00000000 00018400|00840100 00000000) 00000000 00000000 .*
.* (00000000 00000002|02000000 00000000) 00000000 00000000 .*
.* (00000000 00000002|02000000 00000000) 00000000 00000000 .*
.* 00000000 00000000 .*
Contents of section \.data:
.* (00000000 00010438|38040100 00000000) 00000000 00000000 .*
.* (00000000 00000002|02000000 00000000) 00000000 00000000 .*
#...
.* <_start>:
.*: (3c 4c 00 02|02 00 4c 3c) addis r2,r12,2
.*: (38 42 81 b0|b0 81 42 38) addi r2,r2,-32336
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 62 80 38|38 80 62 38) addi r3,r2,-32712
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 82 80 08|08 80 82 e8) ld r4,-32760\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 a2 80 10|10 80 a2 e8) ld r5,-32752\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 c2 80 18|18 80 c2 e8) ld r6,-32744\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 e2 80 38|38 80 e2 38) addi r7,r2,-32712
.*: (3d 02 00 00|00 00 02 3d) addis r8,r2,0
.*: (e9 08 80 30|30 80 08 e9) ld r8,-32720\(r8\)
.*: (3d 22 00 00|00 00 22 3d) addis r9,r2,0
.*: (e9 29 80 20|20 80 29 e9) ld r9,-32736\(r9\)
.*: (3d 42 00 00|00 00 42 3d) addis r10,r2,0
.*: (e9 4a 80 28|28 80 4a e9) ld r10,-32728\(r10\)
17 changes: 17 additions & 0 deletions ld/testsuite/ld-powerpc/abs-shared-relr.r
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -pie --hash-style=sysv -z pack-relative-relocs --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#readelf: -rW

Relocation section '\.rela\.dyn' at offset .* contains 6 entries:
+Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
0+10408 0+500000026 R_PPC64_ADDR64 0+1 a \+ 0
0+10430 0+500000014 R_PPC64_GLOB_DAT 0+1 a \+ 0
0+10440 0+500000026 R_PPC64_ADDR64 0+1 a \+ 0
0+10418 0+400000026 R_PPC64_ADDR64 123456789abcdef0 c \+ 0
0+10428 0+400000014 R_PPC64_GLOB_DAT 123456789abcdef0 c \+ 0
0+10450 0+400000026 R_PPC64_ADDR64 123456789abcdef0 c \+ 0

Relocation section '\.relr\.dyn' at offset .* contains 1 entry:
1 offset
0+10438
34 changes: 34 additions & 0 deletions ld/testsuite/ld-powerpc/abs-shared.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -shared --hash-style=sysv --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#objdump: -sdr

#...
Contents of section \.got:
.* (00000000 00018400|00840100 00000000) 00000000 00000000 .*
.* (00000000 00000002|02000000 00000000) 00000000 00000000 .*
.* (00000000 00000002|02000000 00000000) 00000000 00000000 .*
.* 00000000 00000000 .*
Contents of section \.data:
.* (00000000 00010438|38040100 00000000) 00000000 00000000 .*
.* (00000000 00000002|02000000 00000000) 00000000 00000000 .*
#...
.* <_start>:
.*: (3c 4c 00 02|02 00 4c 3c) addis r2,r12,2
.*: (38 42 81 a0|a0 81 42 38) addi r2,r2,-32352
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 62 80 38|38 80 62 38) addi r3,r2,-32712
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 82 80 08|08 80 82 e8) ld r4,-32760\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 a2 80 10|10 80 a2 e8) ld r5,-32752\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 c2 80 18|18 80 c2 e8) ld r6,-32744\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 e2 80 38|38 80 e2 38) addi r7,r2,-32712
.*: (3d 02 00 00|00 00 02 3d) addis r8,r2,0
.*: (e9 08 80 30|30 80 08 e9) ld r8,-32720\(r8\)
.*: (3d 22 00 00|00 00 22 3d) addis r9,r2,0
.*: (e9 29 80 20|20 80 29 e9) ld r9,-32736\(r9\)
.*: (3d 42 00 00|00 00 42 3d) addis r10,r2,0
.*: (e9 4a 80 28|28 80 4a e9) ld r10,-32728\(r10\)
14 changes: 14 additions & 0 deletions ld/testsuite/ld-powerpc/abs-shared.r
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -shared --hash-style=sysv --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#readelf: -rW

Relocation section '\.rela\.dyn' at offset .* contains 7 entries:
+Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
0+10438 0+000000016 R_PPC64_RELATIVE +10438
0+10408 0+500000026 R_PPC64_ADDR64 0+1 a \+ 0
0+10430 0+500000014 R_PPC64_GLOB_DAT 0+1 a \+ 0
0+10440 0+500000026 R_PPC64_ADDR64 0+1 a \+ 0
0+10418 0+400000026 R_PPC64_ADDR64 123456789abcdef0 c \+ 0
0+10428 0+400000014 R_PPC64_GLOB_DAT 123456789abcdef0 c \+ 0
0+10450 0+400000026 R_PPC64_ADDR64 123456789abcdef0 c \+ 0
32 changes: 32 additions & 0 deletions ld/testsuite/ld-powerpc/abs-static.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -static --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#objdump: -sdr

#...
Contents of section \.got:
.* (00000000 10018100|00810110 00000000) (12345678 9abcdef0|f0debc9a 78563412) .*
.* (12345678 9abcdef0|f0debc9a 78563412) .*
Contents of section \.data:
.* (00000000 10010118|18010110 00000000) (00000000 00000001|01000000 00000000) .*
.* (00000000 00000002|02000000 00000000) (12345678 9abcdef0|f0debc9a 78563412) .*
#...
.* <_start>:
.*: (3c 40 10 02|02 10 40 3c) lis r2,4098
.*: (38 42 81 00|00 81 42 38) addi r2,r2,-32512
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 62 80 18|18 80 62 38) addi r3,r2,-32744
.*: (3c 82 ef fe|fe ef 82 3c) addis r4,r2,-4098
.*: (38 84 7f 01|01 7f 84 38) addi r4,r4,32513
.*: (3c a2 ef fe|fe ef a2 3c) addis r5,r2,-4098
.*: (38 a5 7f 02|02 7f a5 38) addi r5,r5,32514
.*: (60 00 00 00|00 00 00 60) nop
.*: (e8 c2 80 08|08 80 c2 e8) ld r6,-32760\(r2\)
.*: (60 00 00 00|00 00 00 60) nop
.*: (38 e2 80 18|18 80 e2 38) addi r7,r2,-32744
.*: (3d 02 ef fe|fe ef 02 3d) addis r8,r2,-4098
.*: (39 08 7f 01|01 7f 08 39) addi r8,r8,32513
.*: (3d 22 ef fe|fe ef 22 3d) addis r9,r2,-4098
.*: (39 29 7f 02|02 7f 29 39) addi r9,r9,32514
.*: (60 00 00 00|00 00 00 60) nop
.*: (e9 42 80 10|10 80 42 e9) ld r10,-32752\(r2\)
6 changes: 6 additions & 0 deletions ld/testsuite/ld-powerpc/abs-static.r
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#source: abs-reloc.s
#as: -a64
#ld: -melf64ppc -static --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0
#readelf: -rW

There are no relocations in this file.
20 changes: 20 additions & 0 deletions ld/testsuite/ld-powerpc/powerpc.exp
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,26 @@ set ppc64elftests {
{"startstop" "-shared -melf64ppc --hash-style=sysv --gc-sections -z start-stop-gc" ""
"-a64 -mpower10" {startstop.s}
{{objdump -d startstop.d} {readelf {-rW} startstop.r}} "startstop.so"}
{"abs-static" "-melf64ppc -static --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0" ""
"-a64" {abs-reloc.s}
{{objdump {-sdr} abs-static.d}
{readelf {-rW} abs-static.r}} "abs-static"}
{"abs-pie" "-melf64ppc -pie --hash-style=sysv --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0" ""
"-a64" {abs-reloc.s}
{{objdump {-sdr} abs-pie.d}
{readelf {-rW} abs-pie.r}} "abs-pie"}
{"abs-shared" "-melf64ppc -shared --hash-style=sysv --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0" ""
"-a64" {abs-reloc.s}
{{objdump {-sdr} abs-shared.d}
{readelf {-rW} abs-shared.r}} "abs-shared"}
{"abs-pie-relr" "-melf64ppc -pie --hash-style=sysv -z pack-relative-relocs --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0" ""
"-a64" {abs-reloc.s}
{{objdump {-sdr} abs-pie-relr.d}
{readelf {-rW} abs-pie-relr.r}} "abs-pie-relr"}
{"abs-shared-relr" "-melf64ppc -shared --hash-style=sysv -z pack-relative-relocs --defsym a=1 --defsym 'HIDDEN(b=2)' --defsym c=0x123456789abcdef0" ""
"-a64" {abs-reloc.s}
{{objdump {-sdr} abs-shared-relr.d}
{readelf {-rW} abs-shared-relr.r}} "abs-shared-relr"}
}

set ppceabitests {
Expand Down

0 comments on commit 3a3a4c1

Please sign in to comment.