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 $0x40,%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>
[...]
这是在编译时偏移61310
对PLT函数的反汇编:
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 $0x294
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 并且编译时偏移量保留在内存中。在运行时,这些地址无效并导致段错误。
相关文章:
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- 为什么我的 HWID 锁接受任何acceptedSerial_2值
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 可能我知道为什么这段代码没有给出任何输出吗?
- 为什么下面的Hello World程序在PowerShell上没有显示任何输出?同一程序在CMD上显示正确的输出
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 为什么这个程序对投掷不做任何事情?
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 执行此代码时,它不显示任何输出.为什么?
- 我是C++新手,我想知道,为什么在c ++中使用纯虚函数?为什么要使用纯虚函数?
- 给定一个 3 x 3 矩阵或任何 n x n 矩阵,为什么我的以下函数找不到对角线差异?
- 为什么我的突变器函数没有设置任何内容?还是我的构造函数?
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 如何在 if 语句中声明对象并在任何我想的地方使用它?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- PLT代码中的隔离错误.任何想法为什么
- 按回车键后,程序没有输出任何结果.为什么会这样
- 语句调用构造函数,但对构造函数不做任何操作——为什么它不能编译