2012-04-21 53 views
0

在CentOS 5.1 g ++ 4.1.2和4.6.3和4.7.0下測試,它們都產生相同的結果。我該如何解決這個問題?基本上我不能用Debug構建構建llvm。gcc -g與-fPIC衝突?

[hidden]$ cat x.cpp 
#include <iostream> 

int main() { 
} 
[hidden]$ g++ -c -fPIC -g x.cpp 
[hidden]$ objdump -r x.o | grep R_X86_64_32 | head -10 
000000000000001c R_X86_64_32  .debug_frame 
0000000000000044 R_X86_64_32  .debug_frame 
000000000000006c R_X86_64_32  .debug_frame 
0000000000000006 R_X86_64_32  .debug_abbrev 
000000000000000c R_X86_64_32  .debug_str+0x0000000000000414 
0000000000000011 R_X86_64_32  .debug_str+0x00000000000007f2 
0000000000000015 R_X86_64_32  .debug_str+0x000000000000017b 
0000000000000029 R_X86_64_32  .debug_line 
000000000000002e R_X86_64_32  .debug_str+0x0000000000000422 
0000000000000034 R_X86_64_32  .debug_str+0x0000000000000607 

回答

0

這些不是動態重定位。他們將在鏈接時解決。這不會破壞-fPIC。

記住有兩種鏈接,靜態和動態。當您從目標文件中編譯最終的程序二進制文件時,編譯器/鏈接程序將執行靜態鏈接,並且由操作系統完成動態鏈接(在Linux的情況下爲ld-linux.so)。

要獲取動態重定位列表,請使用objdump -R。它只能用於動態鏈接的二進制文件,但是(即不是.o文件)。

+0

所以這是不對的:http://sourceware.org/ml/binutils/2006-09/msg00142.html。那麼在構建時找出「重定位R_X86_64_PC32」錯誤的最佳方式是什麼?我在谷歌搜索,但沒有運氣。 – 2012-04-21 00:42:44

+0

我可以重現該錯誤的唯一方法是嘗試將未使用-fPIC編譯的對象鏈接到共享庫中。在鏈接它的帖子的情況下,它可能是一個錯誤,或者這張海報可能剛剛得到的文件困惑 - 也許有兩個yuv2rgb.o副本?這並不罕見。 – 2012-04-21 01:31:19

+0

即該人如何檢查動態重定位是錯誤的。如果只有在使用-g鏈接共享庫時遇到問題,那麼這可能是gcc中的一個錯誤。 – 2012-04-22 01:14:22

1

我該如何解決這個問題?

您沒有問題需要解決(您沒有顯示任何問題跡象)。

沒有,-g-fPIC完美兼容互相沖突。