(gdb) bt
#0 0x0000000000000706 in ?? ()
#1 0x0000555555554b69 in foo ()
at /export/gnu/import/git/gcc/gcc/testsuite/g++.dg/ext/mv1.C:32
#2 0x00007ffff7de76b8 in _dl_relocate_object ()
from /lib64/ld-linux-x86-64.so.2
#3 0x00007ffff7ddea4a in dl_main () from /lib64/ld-linux-x86-64.so.2
#4 0x00007ffff7df28d5 in _dl_sysdep_start () from /lib64/ld-linux-x86-64.so.2
#5 0x00007ffff7ddfce1 in _dl_start () from /lib64/ld-linux-x86-64.so.2
#6 0x00007ffff7ddbcd8 in _start () from /lib64/ld-linux-x86-64.so.2
#7 0x0000000000000001 in ?? ()
#8 0x00007fffffffe18d in ?? ()
#9 0x0000000000000000 in ?? ()
(gdb) f 1
#1 0x0000555555554b69 in foo ()
at /export/gnu/import/git/gcc/gcc/testsuite/g++.dg/ext/mv1.C:32
32 int (*p)() = &foo;
(gdb) disass
Dump of assembler code for function _Z3foov.resolver(void):
0x0000555555554b60 <+0>: sub $0x8,%rsp
0x0000555555554b64 <+4>: callq 0x555555554700 <__cpu_indicator_init@plt>
=> 0x0000555555554b69 <+9>: mov 0x200740(%rip),%rsi # 0x5555557552b0
0x0000555555554b70 <+16>: mov 0xc(%rsi),%edx
0x0000555555554b73 <+19>: mov %edx,%eax
0x0000555555554b75 <+21>: mov %edx,%ecx
0x0000555555554b77 <+23>: and $0x400,%eax
0x0000555555554b7c <+28>: and $0x40,%ecx
0x0000555555554b7f <+31>: cmp %ecx,%eax
0x0000555555554b81 <+33>: cmovg %ecx,%eax
0x0000555555554b84 <+36>: test %eax,%eax
0x0000555555554b86 <+38>: jle 0x555555554b98 <_Z3foov.resolver(void)+56>
0x0000555555554b88 <+40>: lea -0xbf(%rip),%rax # 0x555555554ad0 <_Z3foov.avx2_ssse3>
0x0000555555554b8f <+47>: add $0x8,%rsp
0x0000555555554b93 <+51>: retq
0x0000555555554b94 <+52>: nopl 0x0(%rax)
0x0000555555554b98 <+56>: cmpl $0x8,0x8(%rsi)
0x0000555555554b9c <+60>: jne 0x555555554bb0 <_Z3foov.resolver(void)+80---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) disass 0x0000555555554700,+16
Dump of assembler code from 0x555555554700 to 0x555555554710:
0x0000555555554700 <__cpu_indicator_init@plt+0>: jmpq *0x200be2(%rip) # 0x5555557552e8 <email address hidden>
0x0000555555554706 <__cpu_indicator_init@plt+6>: pushq $0x2
0x000055555555470b <__cpu_indicator_init@plt+11>: jmpq 0x5555555546c0
End of assembler dump.
(gdb)
We can't call __cpu_indicator_init in PIE while PIE is being relocated.
Its .got.plt section hasn't been updated. It works for non-PIE since
no update on .got.plt section is required. Can we move __cpu_indicator_init
to main executable?
(gdb) bt gnu/import/ git/gcc/ gcc/testsuite/ g++.dg/ ext/mv1. C:32 ld-linux- x86-64. so.2 ld-linux- x86-64. so.2 ld-linux- x86-64. so.2 ld-linux- x86-64. so.2 ld-linux- x86-64. so.2 gnu/import/ git/gcc/ gcc/testsuite/ g++.dg/ ext/mv1. C:32 resolver( void): 554b60 <+0>: sub $0x8,%rsp 554b64 <+4>: callq 0x555555554700 <__cpu_ indicator_ init@plt> 554b70 <+16>: mov 0xc(%rsi),%edx 554b73 <+19>: mov %edx,%eax 554b75 <+21>: mov %edx,%ecx 554b77 <+23>: and $0x400,%eax 554b7c <+28>: and $0x40,%ecx 554b7f <+31>: cmp %ecx,%eax 554b81 <+33>: cmovg %ecx,%eax 554b84 <+36>: test %eax,%eax 554b86 <+38>: jle 0x555555554b98 <_Z3foov. resolver( void)+56> 554b88 <+40>: lea -0xbf(%rip),%rax # 0x555555554ad0 <_Z3foov. avx2_ssse3> 554b8f <+47>: add $0x8,%rsp 554b93 <+51>: retq 554b94 <+52>: nopl 0x0(%rax) 554b98 <+56>: cmpl $0x8,0x8(%rsi) 554b9c <+60>: jne 0x555555554bb0 <_Z3foov. resolver( void)+80- --Type <return> to continue, or q <return> to quit---q 700,+16 554700 <__cpu_ indicator_ init@plt+ 0>: jmpq *0x200be2(%rip) # 0x5555557552e8 <email address hidden> 554706 <__cpu_ indicator_ init@plt+ 6>: pushq $0x2 55470b <__cpu_ indicator_ init@plt+ 11>: jmpq 0x5555555546c0
#0 0x0000000000000706 in ?? ()
#1 0x0000555555554b69 in foo ()
at /export/
#2 0x00007ffff7de76b8 in _dl_relocate_object ()
from /lib64/
#3 0x00007ffff7ddea4a in dl_main () from /lib64/
#4 0x00007ffff7df28d5 in _dl_sysdep_start () from /lib64/
#5 0x00007ffff7ddfce1 in _dl_start () from /lib64/
#6 0x00007ffff7ddbcd8 in _start () from /lib64/
#7 0x0000000000000001 in ?? ()
#8 0x00007fffffffe18d in ?? ()
#9 0x0000000000000000 in ?? ()
(gdb) f 1
#1 0x0000555555554b69 in foo ()
at /export/
32 int (*p)() = &foo;
(gdb) disass
Dump of assembler code for function _Z3foov.
0x0000555555
0x0000555555
=> 0x0000555555554b69 <+9>: mov 0x200740(%rip),%rsi # 0x5555557552b0
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
0x0000555555
Quit
(gdb) disass 0x0000555555554
Dump of assembler code from 0x555555554700 to 0x555555554710:
0x0000555555
0x0000555555
0x0000555555
End of assembler dump.
(gdb)
We can't call __cpu_indicator _init in PIE while PIE is being relocated. _init
Its .got.plt section hasn't been updated. It works for non-PIE since
no update on .got.plt section is required. Can we move __cpu_indicator
to main executable?