我正在尝试将c程序转换为c ++。该程序生成一组“* .so”文件,用于llvm生成的另一个程序。基本上llvm生成的代码具有对当前代码的回调。我正在使用LDPRELOAD加载这些
作为第一步,我只是用c ++编译代码。汇编工作正常。但是当它运行时会出现段错误。标签dec_blk
应该包含函数dec_blk()
的地址。我已经使用extern "C"
用于该函数及其原型来防止demangling。当它使用c版本运行时,标签具有正确的地址,但是当我使用c ++版本运行它时,该标签的值为0.我在下面提供详细信息
LLVM代码
subq $24, %rsp
movq dec_blk, %rax
movq dec_blk+8, %rcx
movq %rdi, 16(%rsp)
movq %rcx, %rdi
movq 16(%rsp), %rcx
movq %rsi, 8(%rsp)
movq %rcx, %rsi
movq 8(%rsp), %rdx
callq *%rax # segfaults here
功能声明
extern "C"
{
long int dec_blk(void*, long int*, long int* );
}
你能帮忙找点什么吗?我正在使用gdb进行调试
答案 0 :(得分:0)
有一个标签dec_blk,它应该包含函数dec_blk()的地址。 ...但是,当我使用c ++版本运行它时,该标签的值为0
您的说明符合此代码(您未展示):
extern "C" long int dec_blk(...);
int main() {
return dec_blk();
}
但您问题中的反汇编与此代码(不同的)相匹配:
extern "C" long int (*dec_blk)(...);
int main() {
return dec_blk();
}
这两个片段完全没有相同。我猜你在使用第一个函数时已经使用了第二个函数。