2

我正在尝试将 ac 程序转换为 c++。该程序生成一组“*.so”文件,用于由 llvm 生成的另一个程序。基本上,llvm 生成的代码具有对当前代码的回调。我正在使用 LDPRELOAD 加载这些

作为第一步,我只是用 c++ 编译代码。编译工作正常。但是运行时会出现段错误。有一个标签dec_blk应该包含函数的地址dec_blk()。我已经使用extern "C"该函数及其原型来防止拆解。当它使用 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 进行调试

4

1 回答 1

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();
}

这两个片段根本一样。我猜您在打算使用第一个功能时使用了第二个功能。

于 2013-02-25T16:43:15.713 回答