PLT 代码中的段错误。任何想法为什么?
Segfault in PLT code. Any ideas why?
我有一个共享库,它通过调用以下函数进行初始化:
extern "C" {
int pa__init(pa_module *m) {
m->userdata = new PAModule(m);
return 0;
}
} // extern "C"
它被编译成这个(地址是编译时偏移量):
0000000000064717 <pa__init>:
[...]
64726: bf 40 00 00 00 mov [=11=]x40,%edi
6472b: e8 e0 cb ff ff callq 61310 <operator new(unsigned long)@plt>
64730: 48 89 c3 mov %rax,%rbx
64733: 48 8b 45 d8 mov -0x28(%rbp),%rax
64737: 48 89 c6 mov %rax,%rsi
6473a: 48 89 df mov %rbx,%rdi
6473d: e8 2e e1 ff ff callq 62870 <PAModule::PAModule(pa_module*)@plt>
[...]
这是PLT函数在编译时的反汇编偏移61310
:
0000000000061310 <operator new(unsigned long)@plt>:
61310: ff 25 a2 c1 66 00 jmpq *0x66c1a2(%rip) # 6cd4b8 <operator new(unsigned long)@@Base+0x57f708>
61316: 68 94 02 00 00 pushq [=12=]x294
6131b: e9 a0 d6 ff ff jmpq 5e9c0 <.plt>
当我加载库并调用此方法时,我在编译时偏移 61310
:
处遇到段错误
#0 0x0000000000061316 in ?? ()
#1 0x00007fd9faae9730 in pa__init (m=0x55f1a750d850) at pa_module.cpp:24
[...]
编译时 GOT 中的值偏移 6cd4b8
(在运行时重新定位到例如 0x7fced7ffa4b8
)是
0x7fced7ffa4b8: 0x00061316
处理器试图跳转到那个位置。但是,这仍然是编译时偏移量(指向无效内存),这就是程序段错误的原因。
知道为什么在加载我的库时 GOT 中的条目没有重新定位吗?
非常感谢!
我的图书馆原来有未定义的符号。
这阻止了动态链接加载器成功更新 GOT 并且编译时间偏移量保存在内存中。在运行时这些地址无效并导致段错误。
我有一个共享库,它通过调用以下函数进行初始化:
extern "C" {
int pa__init(pa_module *m) {
m->userdata = new PAModule(m);
return 0;
}
} // extern "C"
它被编译成这个(地址是编译时偏移量):
0000000000064717 <pa__init>:
[...]
64726: bf 40 00 00 00 mov [=11=]x40,%edi
6472b: e8 e0 cb ff ff callq 61310 <operator new(unsigned long)@plt>
64730: 48 89 c3 mov %rax,%rbx
64733: 48 8b 45 d8 mov -0x28(%rbp),%rax
64737: 48 89 c6 mov %rax,%rsi
6473a: 48 89 df mov %rbx,%rdi
6473d: e8 2e e1 ff ff callq 62870 <PAModule::PAModule(pa_module*)@plt>
[...]
这是PLT函数在编译时的反汇编偏移61310
:
0000000000061310 <operator new(unsigned long)@plt>:
61310: ff 25 a2 c1 66 00 jmpq *0x66c1a2(%rip) # 6cd4b8 <operator new(unsigned long)@@Base+0x57f708>
61316: 68 94 02 00 00 pushq [=12=]x294
6131b: e9 a0 d6 ff ff jmpq 5e9c0 <.plt>
当我加载库并调用此方法时,我在编译时偏移 61310
:
#0 0x0000000000061316 in ?? ()
#1 0x00007fd9faae9730 in pa__init (m=0x55f1a750d850) at pa_module.cpp:24
[...]
编译时 GOT 中的值偏移 6cd4b8
(在运行时重新定位到例如 0x7fced7ffa4b8
)是
0x7fced7ffa4b8: 0x00061316
处理器试图跳转到那个位置。但是,这仍然是编译时偏移量(指向无效内存),这就是程序段错误的原因。
知道为什么在加载我的库时 GOT 中的条目没有重新定位吗?
非常感谢!
我的图书馆原来有未定义的符号。
这阻止了动态链接加载器成功更新 GOT 并且编译时间偏移量保存在内存中。在运行时这些地址无效并导致段错误。