From 833aa67d03a955a8575a361260423d594e9ae24c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 23 Aug 2025 09:35:50 -0700 Subject: [PATCH] x86-64: Use the GOT indirection in no-plt-check1.S There is cmpq %rax, func_p(%rip) in no-plt-check1.S which requires copy relocation when func_p, a function pointer, is defined in a shared library. Use the GOT indirection to access func_p movq func_p@GOTPCREL(%rip), %rdx cmpq %rax, (%rdx) to remove copy relocation to support PIE without copy relocation. PR ld/33237 * testsuite/ld-x86-64/no-plt-check1.S: Use the GOT indirection to access func_p. * testsuite/ld-x86-64/no-plt-1a.dd: Adjusted. * testsuite/ld-x86-64/no-plt-1b.dd: Likewise. * testsuite/ld-x86-64/no-plt-1a.dd: Likewise. * testsuite/ld-x86-64/no-plt-1b.dd: Likewise. * testsuite/ld-x86-64/no-plt-1c.dd: Likewise. * testsuite/ld-x86-64/no-plt-1d.dd: Likewise. * testsuite/ld-x86-64/no-plt-1e.dd: Likewise. * testsuite/ld-x86-64/no-plt-1f.dd: Likewise. * testsuite/ld-x86-64/no-plt-1g.dd: Likewise. Signed-off-by: H.J. Lu --- ld/testsuite/ld-x86-64/no-plt-1a.dd | 5 +++-- ld/testsuite/ld-x86-64/no-plt-1b.dd | 5 +++-- ld/testsuite/ld-x86-64/no-plt-1c.dd | 5 +++-- ld/testsuite/ld-x86-64/no-plt-1d.dd | 5 +++-- ld/testsuite/ld-x86-64/no-plt-1e.dd | 5 +++-- ld/testsuite/ld-x86-64/no-plt-1f.dd | 5 +++-- ld/testsuite/ld-x86-64/no-plt-1g.dd | 5 +++-- ld/testsuite/ld-x86-64/no-plt-check1.S | 6 ++++-- 8 files changed, 25 insertions(+), 16 deletions(-) diff --git a/ld/testsuite/ld-x86-64/no-plt-1a.dd b/ld/testsuite/ld-x86-64/no-plt-1a.dd index b1d5d7e491a..89bfaa1f3ac 100644 --- a/ld/testsuite/ld-x86-64/no-plt-1a.dd +++ b/ld/testsuite/ld-x86-64/no-plt-1a.dd @@ -10,8 +10,9 @@ Disassembly of section .text: +[a-f0-9]+: 48 83 ec 08 sub \$0x8,%rsp +[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 call [0-9a-f]+ +[a-f0-9]+: 48 81 f8 ([0-9a-f]{2} ){4}[ ]+cmp \$0x[0-9a-f]+,%rax - +[a-f0-9]+: 75 34 jne [0-9a-f]+ - +[a-f0-9]+: 4(0|8) 39 05 ([0-9a-f]{2} ){4}[ ]+(rex |)cmp +%(e|r)ax,0x[0-9a-f]+\(%rip\) +# [a-f0-9]+ + +[a-f0-9]+: 75 37 jne [0-9a-f]+ + +[a-f0-9]+: 4(0|8) c7 c2 ([0-9a-f]{2} ){4}[ ]+(rex |)mov +\$0x[0-9a-f]+,%(e|r)dx + +[a-f0-9]+: (48|67) 39 02[ ]+cmp +%(e|r)ax,\(%(e|r)dx\) +[a-f0-9]+: 75 2b jne [0-9a-f]+ +[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 call [0-9a-f]+ +[a-f0-9]+: 3d 78 56 34 12 cmp \$0x12345678,%eax diff --git a/ld/testsuite/ld-x86-64/no-plt-1b.dd b/ld/testsuite/ld-x86-64/no-plt-1b.dd index 2ab8da59413..1f430b88e39 100644 --- a/ld/testsuite/ld-x86-64/no-plt-1b.dd +++ b/ld/testsuite/ld-x86-64/no-plt-1b.dd @@ -10,8 +10,9 @@ Disassembly of section .text: +[a-f0-9]+: 48 83 ec 08 sub \$0x8,%rsp +[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4}[ ]+call \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <.*> +[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4}[ ]+cmp 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <.*> - +[a-f0-9]+: 75 34 jne [0-9a-f]+ - +[a-f0-9]+: 4(0|8) 39 05 ([0-9a-f]{2} ){4}[ ]+(rex |)cmp +%(e|r)ax,0x[0-9a-f]+\(%rip\) +# [a-f0-9]+ <.*> + +[a-f0-9]+: 75 37 jne [0-9a-f]+ + +[a-f0-9]+: 4(0|8) 8b 15 ([0-9a-f]{2} ){4}[ ]+(rex |)mov +0x[0-9a-f]+\(%rip\),%(e|r)dx +# [a-f0-9]+ <.*> + +[a-f0-9]+: (48|67) 39 02[ ]+cmp +%(e|r)ax,\(%(e|r)dx\) +[a-f0-9]+: 75 2b jne [0-9a-f]+ +[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4}[ ]+call \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <.*> +[a-f0-9]+: 3d 78 56 34 12 cmp \$0x12345678,%eax diff --git a/ld/testsuite/ld-x86-64/no-plt-1c.dd b/ld/testsuite/ld-x86-64/no-plt-1c.dd index 1f6ea274ed2..ef772af8a62 100644 --- a/ld/testsuite/ld-x86-64/no-plt-1c.dd +++ b/ld/testsuite/ld-x86-64/no-plt-1c.dd @@ -10,8 +10,9 @@ Disassembly of section .text: +[a-f0-9]+: 48 83 ec 08 sub \$0x8,%rsp +[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4}[ ]+call \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <.*> +[a-f0-9]+: 48 81 f8 ([0-9a-f]{2} ){4}[ ]+cmp \$0x[0-9a-f]+,%rax - +[a-f0-9]+: 75 34 jne [0-9a-f]+ - +[a-f0-9]+: 4(0|8) 39 05 ([0-9a-f]{2} ){4}[ ]+(rex |)cmp +%(e|r)ax,0x[0-9a-f]+\(%rip\) +# [a-f0-9]+ <.*> + +[a-f0-9]+: 75 37 jne [0-9a-f]+ + +[a-f0-9]+: 4(0|8) 8b 15 ([0-9a-f]{2} ){4}[ ]+(rex |)mov +0x[0-9a-f]+\(%rip\),%(e|r)dx +# [a-f0-9]+ <.*> + +[a-f0-9]+: (48|67) 39 02[ ]+cmp +%(e|r)ax,\(%(e|r)dx\) +[a-f0-9]+: 75 2b jne [0-9a-f]+ +[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 call [0-9a-f]+ +[a-f0-9]+: 3d 78 56 34 12 cmp \$0x12345678,%eax diff --git a/ld/testsuite/ld-x86-64/no-plt-1d.dd b/ld/testsuite/ld-x86-64/no-plt-1d.dd index 49f34ade77d..cd500bd2a71 100644 --- a/ld/testsuite/ld-x86-64/no-plt-1d.dd +++ b/ld/testsuite/ld-x86-64/no-plt-1d.dd @@ -10,8 +10,9 @@ Disassembly of section .text: +[a-f0-9]+: 48 83 ec 08 sub \$0x8,%rsp +[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 call [0-9a-f]+ +[a-f0-9]+: 48 81 f8 ([0-9a-f]{2} ){4}[ ]+cmp \$0x[0-9a-f]+,%rax - +[a-f0-9]+: 75 34 jne [0-9a-f]+ - +[a-f0-9]+: 4(0|8) 39 05 ([0-9a-f]{2} ){4}[ ]+(rex |)cmp +%(e|r)ax,0x[0-9a-f]+\(%rip\) +# [a-f0-9]+ + +[a-f0-9]+: 75 37 jne [0-9a-f]+ + +[a-f0-9]+: 4(0|8) c7 c2 ([0-9a-f]{2} ){4}[ ]+(rex |)mov +\$0x[0-9a-f]+,%(e|r)dx + +[a-f0-9]+: (48|67) 39 02[ ]+cmp +%(e|r)ax,\(%(e|r)dx\) +[a-f0-9]+: 75 2b jne [0-9a-f]+ +[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 call [0-9a-f]+ +[a-f0-9]+: 3d 78 56 34 12 cmp \$0x12345678,%eax diff --git a/ld/testsuite/ld-x86-64/no-plt-1e.dd b/ld/testsuite/ld-x86-64/no-plt-1e.dd index 465574f745b..0180dd3d938 100644 --- a/ld/testsuite/ld-x86-64/no-plt-1e.dd +++ b/ld/testsuite/ld-x86-64/no-plt-1e.dd @@ -10,8 +10,9 @@ Disassembly of section .text: +[a-f0-9]+: 48 83 ec 08 sub \$0x8,%rsp +[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 call [0-9a-f]+ +[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4}[ ]+cmp 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <.*> - +[a-f0-9]+: 75 34 jne [0-9a-f]+ - +[a-f0-9]+: 4(0|8) 39 05 ([0-9a-f]{2} ){4}[ ]+(rex |)cmp +%(e|r)ax,0x[0-9a-f]+\(%rip\) +# [a-f0-9]+ + +[a-f0-9]+: 75 37 jne [0-9a-f]+ + +[a-f0-9]+: 4(0|8) 8d 15 ([0-9a-f]{2} ){4}[ ]+(rex |)lea +0x[0-9a-f]+\(%rip\),%(e|r)dx +# [a-f0-9]+ + +[a-f0-9]+: (48|67) 39 02[ ]+cmp +%(e|r)ax,\(%(e|r)dx\) +[a-f0-9]+: 75 2b jne [0-9a-f]+ +[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 call [0-9a-f]+ +[a-f0-9]+: 3d 78 56 34 12 cmp \$0x12345678,%eax diff --git a/ld/testsuite/ld-x86-64/no-plt-1f.dd b/ld/testsuite/ld-x86-64/no-plt-1f.dd index 2ab8da59413..1f430b88e39 100644 --- a/ld/testsuite/ld-x86-64/no-plt-1f.dd +++ b/ld/testsuite/ld-x86-64/no-plt-1f.dd @@ -10,8 +10,9 @@ Disassembly of section .text: +[a-f0-9]+: 48 83 ec 08 sub \$0x8,%rsp +[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4}[ ]+call \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <.*> +[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4}[ ]+cmp 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <.*> - +[a-f0-9]+: 75 34 jne [0-9a-f]+ - +[a-f0-9]+: 4(0|8) 39 05 ([0-9a-f]{2} ){4}[ ]+(rex |)cmp +%(e|r)ax,0x[0-9a-f]+\(%rip\) +# [a-f0-9]+ <.*> + +[a-f0-9]+: 75 37 jne [0-9a-f]+ + +[a-f0-9]+: 4(0|8) 8b 15 ([0-9a-f]{2} ){4}[ ]+(rex |)mov +0x[0-9a-f]+\(%rip\),%(e|r)dx +# [a-f0-9]+ <.*> + +[a-f0-9]+: (48|67) 39 02[ ]+cmp +%(e|r)ax,\(%(e|r)dx\) +[a-f0-9]+: 75 2b jne [0-9a-f]+ +[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4}[ ]+call \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <.*> +[a-f0-9]+: 3d 78 56 34 12 cmp \$0x12345678,%eax diff --git a/ld/testsuite/ld-x86-64/no-plt-1g.dd b/ld/testsuite/ld-x86-64/no-plt-1g.dd index 0526fb0cabd..b6adc0d1181 100644 --- a/ld/testsuite/ld-x86-64/no-plt-1g.dd +++ b/ld/testsuite/ld-x86-64/no-plt-1g.dd @@ -10,8 +10,9 @@ Disassembly of section .text: +[a-f0-9]+: 48 83 ec 08 sub \$0x8,%rsp +[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4}[ ]+call \*0x[0-9a-f]+\(%rip\) +# [0-9a-f]+ <.*> +[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4}[ ]+cmp 0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <.*> - +[a-f0-9]+: 75 34 jne [0-9a-f]+ - +[a-f0-9]+: 4(0|8) 39 05 ([0-9a-f]{2} ){4}[ ]+(rex |)cmp +%(e|r)ax,0x[0-9a-f]+\(%rip\) +# [a-f0-9]+ <.*> + +[a-f0-9]+: 75 37 jne [0-9a-f]+ + +[a-f0-9]+: 4(0|8) 8b 15 ([0-9a-f]{2} ){4}[ ]+(rex |)mov +0x[0-9a-f]+\(%rip\),%(e|r)dx +# [a-f0-9]+ <.*> + +[a-f0-9]+: (48|67) 39 02[ ]+cmp +%(e|r)ax,\(%(e|r)dx\) +[a-f0-9]+: 75 2b jne [0-9a-f]+ +[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 call [0-9a-f]+ +[a-f0-9]+: 3d 78 56 34 12 cmp \$0x12345678,%eax diff --git a/ld/testsuite/ld-x86-64/no-plt-check1.S b/ld/testsuite/ld-x86-64/no-plt-check1.S index 61d32b15f8b..4526e5ed334 100644 --- a/ld/testsuite/ld-x86-64/no-plt-check1.S +++ b/ld/testsuite/ld-x86-64/no-plt-check1.S @@ -11,10 +11,12 @@ check: cmpq func@GOTPCREL(%rip), %rax jne .L3 #ifdef __LP64__ - cmpq %rax, func_p(%rip) + movq func_p@GOTPCREL(%rip), %rdx + cmpq %rax, (%rdx) #else rex - cmpl %eax, func_p(%rip) + movl func_p@GOTPCREL(%rip), %edx + cmpl %eax, (%edx) #endif jne .L3 call *func@GOTPCREL(%rip) -- 2.47.3