函数调用时C到C ++错误

时间:2013-02-21 17:03:20

标签: c++ c assembly gdb

我正在尝试将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进行调试

1 个答案:

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

这两个片段完全没有相同。我猜你在使用第一个函数时已经使用了第二个函数。