[PATCH] x86-64: Use the GOT indirection in no-plt-check1.S

H.J. Lu hjl.tools@gmail.com
Sat Aug 23 20:53:45 GMT 2025


On Sat, Aug 23, 2025 at 9:35 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> 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.

I am checking it in.

> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> ---
>  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]+ <get_func>
>   +[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]+ <check\+0x[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]+ <func_p>
> + +[a-f0-9]+:   75 37                   jne    [0-9a-f]+ <check\+0x[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]+ <check\+0x[0-9a-f]+>
>   +[a-f0-9]+:   67 e8 ([0-9a-f]{2} ){4}[        ]+addr32 call [0-9a-f]+ <func>
>   +[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]+ <check\+0x[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]+ <check\+0x[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]+ <check\+0x[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]+ <check\+0x[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]+ <check\+0x[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]+ <check\+0x[0-9a-f]+>
>   +[a-f0-9]+:   67 e8 ([0-9a-f]{2} ){4}[        ]+addr32 call [0-9a-f]+ <func>
>   +[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]+ <get_func>
>   +[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]+ <check\+0x[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]+ <func_p>
> + +[a-f0-9]+:   75 37                   jne    [0-9a-f]+ <check\+0x[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]+ <check\+0x[0-9a-f]+>
>   +[a-f0-9]+:   67 e8 ([0-9a-f]{2} ){4}[        ]+addr32 call [0-9a-f]+ <func>
>   +[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]+ <get_func>
>   +[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]+ <check\+0x[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]+ <func_p>
> + +[a-f0-9]+:   75 37                   jne    [0-9a-f]+ <check\+0x[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]+ <func_p>
> + +[a-f0-9]+:   (48|67) 39 02[  ]+cmp +%(e|r)ax,\(%(e|r)dx\)
>   +[a-f0-9]+:   75 2b                   jne    [0-9a-f]+ <check\+0x[0-9a-f]+>
>   +[a-f0-9]+:   67 e8 ([0-9a-f]{2} ){4}[        ]+addr32 call [0-9a-f]+ <func>
>   +[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]+ <check\+0x[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]+ <check\+0x[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]+ <check\+0x[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]+ <check\+0x[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]+ <check\+0x[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]+ <check\+0x[0-9a-f]+>
>   +[a-f0-9]+:   67 e8 ([0-9a-f]{2} ){4}[        ]+addr32 call [0-9a-f]+ <func>
>   +[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.51.0
>


-- 
H.J.


More information about the Binutils mailing list