2011-05-28 36 views
3

我正嘗試使用Cgo爲C庫創建綁定。我有使用Cgo導入庫並打電話給它的軟件包。它編譯和安裝很好。但是,當嘗試從Go程序使用該程序包時,鏈接時出現錯誤「意外的R_X86_64_64重新定位動態符號」。「意外的R_X86_64_64重新定位動態符號」使用Cgo時

任何想法?

+0

您是否找到任何解決方案?我的一個庫遇到了完全相同的錯誤。 – 2013-03-24 12:12:57

回答

1

它出現在6g編譯assembly generation例程:

case 256 + R_X86_64_64: 
     if(targ->dynimpname != nil && !targ->dynexport) 
       diag("unexpected R_X86_64_64 relocation for dynamic symbol %s", 
        targ->name); 
     r->type = D_ADDR; 
     return; 

R_X86_64_64是一種在庫中的元件的。有關amd64體系結構中的重定位的更多信息,請參閱頁面70 here

是否有可能將386編譯的庫與amd64代碼混合?

編譯器應報告導致問題的確切符號。你可以嘗試鏈接一個包含其他符號的最小庫,並嘗試找到一個最小的例子,它失敗了嗎?

您是否設法使用cgo與任何庫?

+0

我與最新的Go版本有完全相同的問題。我在amd64上運行linux,該庫是我自己的,只是編譯它並從其他語言中使用它。我可以在沒有任何問題的情況下將cgo用於其他庫此外,我收到了諸如sym#512的錯誤:忽略了第1節(類型0)中的_ZN8exmpl4doISbIwSt11char_traitsIwESaIwEEED5Ev'。 – 2013-03-24 12:16:55

+0

@snøreven它看起來像一個錯位的C++名稱,你可以用'extern「C」{}'來添加包裝你的函數嗎? – 2013-03-24 18:11:41

0

我同意Elazar的看法,似乎是混合了32位和64位代碼。

您是否嘗試過gccgo?

0

就像一個魅力:

[email protected]:/etc# uname -a 
Linux Ubuntu-1304-raring-64-minimal 3.8.13.4 #2 SMP Mon Jul 8 23:59:05 CEST 2013 x86_64 x86_64 x86_64 GNU/Linux 

做這個順序:

cd /usr/local 
mkdir /var/go 
apt-get install mercurial 
hg clone https://code.google.com/p/go/ 

之後,創建一個/etc/profile.d/go.sh與follewing內容,並使其可執行:

export GOPATH=/var/go 
export GOROOT=/usr/local/go 
export GOBIN=$GOPATH/bin 
export PATH=$PATH:$GOBIN 
export GOROOT_FINAL=/var/go 
export GOHOSTARCH=amd64 
export GOARCH=amd64 
export CGO_ENABLED=1 

然後重新啓動你的shell。沒有來源xxx將正常工作 - 被警告!在一個新的外殼做到這一點:

cd /usr/local/go/src 
./make.bash 

做的事,然後所有的事情從/ usr /本地複製/去到/ var /去 - 或有一種方法來合併由符號鏈接兩個目錄,無論你喜歡。之後,在上面的go.sh腳本中註釋GOROOT_FINAL,然後重新啓動您的shell。你可以使用最新的Go語言!

[email protected]:/usr/work/golang/go/src# go version 
go version devel +35d5bae6aac8 Fri Oct 18 10:45:19 2013 +0400 linux/amd64 

請注意:兩個shell重啓是必需的 - 需要重新啓動它 - 我自己很難找到它。