forked from bminor/binutils-gdb
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
PowerPC64 treatment of absolute symbols
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
Showing
13 changed files
with
416 additions
and
62 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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\) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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\) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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\) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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\) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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\) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters