2013-02-21 66 views
2

我想將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

回答

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

這兩個片段是並不相同。我猜你在使用第一個函數時已經使用了第二個函數。

+0

感謝您的回覆,我檢查了....這不是這種情況 – simpleuser 2013-03-04 17:10:18

+0

@simpleuser「情況並非如此」您檢查了* how *?除非您提供,否則您不太可能得到滿意的答案額外的細節(我*仍*認爲我的假設很可能是正確的;至少這是編譯代碼的樣子)。 – 2013-03-05 15:18:33