函数调用C到C++错误

问题描述:

我想将c程序转换为C++。该程序会生成一组“* .so”文件,这些文件在llvm生成的另一个程序中使用。基本上,llvm生成的代码具有对当前代码的回调。我使用LDPRELOAD加载这些文件函数调用C到C++错误

作为第一步,我只是用C++编译代码。汇编工作正常。但是当它运行它segfaults。有一个标签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进行调试

+0

对不起,我的错别字 – simpleuser 2013-02-21 17:26:14

+0

所以你的问题解决了? – 2013-02-22 13:03:52

+0

@phresnel Nooooooooooooooooo :( – simpleuser 2013-02-24 09:53:08

有一个标签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(); 
} 

这两个片段是并不相同。我猜你在使用第一个函数时已经使用了第二个函数。

+0

感谢您的回复,我检查了....这不是这种情况 – simpleuser 2013-03-04 17:10:18

+0

@simpleuser“情况并非如此”您检查了* how *?除非您提供,否则您不太可能得到满意的答案额外的细节(我*仍*认为我的假设很可能是正确的;至少这是编译代码的样子)。 – 2013-03-05 15:18:33