2008-09-18 108 views
21

我建立使用GNU工具鏈的一個項目,直到我得到它聯繫起來,其中連接器抱怨說,它缺少/找不到crti.o一切工作正常。這不是我的目標文件之一,它似乎與libc有關,但我不明白爲什麼它需要這個crti.o,它不會使用庫文件,例如libc.acrti.o文件丟失

我正在爲手臂平臺交叉編譯。我有工具鏈中的文件,但我如何讓鏈接器包含它?

crti.o是在'圖書館'搜索路徑之一,但它應該尋找庫路徑上的.o文件?

是搜索路徑同樣爲gccld

+0

對於Mac ,請參閱:http://stackoverflow.com/questions/1365211/error-in-xcode-project-ld-library-not-found-for-lcrt1-10-6-o/16102800 http://stackoverflow.com/ questio ns/10941247 /命令行 - 庫 - 構建 - 失敗與連接器錯誤/ 16102769 – kenorb 2013-04-19 10:44:44

回答

22

crti.o是bootstrap庫,一般很小。它通常靜態鏈接到你的二進制文件中。它應該在/usr/lib中找到。

如果你正在運行他們往往把所有的開發商東西到-dev包二進制分發(例如libc6的-DEV)作爲不是需要它來運行編譯的程序,只是爲了建立他們。

你不是交叉編譯的嗎?

如果你是交叉編譯它通常是與不匹配gcc的搜索路徑在您crti.o是一個問題。它應該在工具鏈時建立。首先要檢查的是gcc -print-search-dirs並查看crti.o是否在任何這些路徑中。

鏈接實際上是由ld完成的,但它的路徑由gcc傳遞給它。可能最快的方法是找到helloworld.c程序,並查看傳遞給ld的內容,看看發生了什麼。

strace -v -o log -f -e trace=open,fork,execve gcc hello.c -o test 

打開日誌文件,然後搜索crti.o,你可以看到我的交叉編譯:

10616 execve("/usr/bin/ld", ["/usr/bin/ld", "--eh-frame-hdr", "-m", "elf_x86_64", "--hash-style=both", "-dynamic-linker", "/lib64/ld-linux-x86-64.so.2", "-o" 
, "test", "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "-L/usr/lib/gcc/x86_64-linux-g 
nu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/lib/../lib", "-L/usr/lib/../lib", "-L/usr/lib/gcc/x86_64-linux-gnu 
/"..., "/tmp/cc4rFJWD.o", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "-lc", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "/usr/lib/gcc/x86_ 
64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."...], "COLLECT_GCC=gcc", "COLLECT_GCC_OPTIONS=\'-o\' \'test\' "..., "COMPILER_PATH=/usr/lib/gcc/x86_6"..., "LIBRARY_PATH=/usr/lib/gcc/x86_64"..., "CO 
LLECT_NO_DEMANGLE="]) = 0 
10616 open("/etc/ld.so.cache", O_RDONLY) = 3 
10616 open("/usr/lib/libbfd-2.18.0.20080103.so", O_RDONLY) = 3 
10616 open("/lib/libc.so.6", O_RDONLY) = 3 
10616 open("test", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3 
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crt1.o", O_RDONLY) = 4 
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crti.o", O_RDONLY) = 5 
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/crtbegin.o", O_RDONLY) = 6 
10616 open("/tmp/cc4rFJWD.o", O_RDONLY) = 7 

如果你看到open(...crti.o) = -1 ENOENT一堆的嘗試,ld是感到困惑和你想看看它的開放來自路徑...

+0

+1爲非常有用的strace技巧。但我的問題仍然沒有解決(交叉編譯ARM上的pjsip) – FractalSpace 2014-09-17 21:29:33

+0

@FractalSpace它可能是一個不同的問題。你可以發佈你的輸出的問題嗎? – stsquad 2014-09-18 16:16:08

0

我得到同樣的問題,在Ubuntu默認安裝8.04。我必須手動獲取libc開發人員頭文件/文件才能工作。

1

好的,我不得不重新安裝工具鏈,以便包括丟失的文件。這似乎很奇怪,因爲它應該在gcc路徑上找到它。我猜想的主要問題是我的計算機上有15個左右不同的crti.o文件,並沒有指向正確的文件。不過,因爲不會使,但現在它工作:-)感謝您的幫助:-)

1

我有一個嚴重的建立交叉編譯器類似的問題。我周圍有像這樣:

/home/rob/compiler/usr/bin/arm-linux-gcc --sysroot=/home/rob/compiler hello.c 

這假定/ lib目錄,/ usr/include目錄等所描述的地點由SYSROOT選項指向。這可能不是應該如何完成的,但是當我需要編譯一個簡單的C文件時,它使我擺脫了麻煩。

0

這解決了我(交叉編譯PJSIP爲ARM):

export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot' 
2

我不得不同時交叉編譯同樣的問題。 crti.o在<sysroot>/usr/lib64但鏈接器不會找到它。

原來,創建一個空目錄<sysroot>/usr/lib修復了這個問題。看來,鏈接器將搜索路徑<SYSROOT>/usr/lib目錄第一,且僅當它存在,它甚至會考慮<SYSROOT>在/ usr/lib64下

這是鏈接器中的錯誤嗎?或者這種行爲記錄在某處?

1

在我的情況Linux Mint 18.0/Ubuntu 16.04,我沒有crti.o可言:

$ find /usr/ -name crti* 

我覺得沒有什麼,所以我安裝開發包:

sudo apt-get install libc6-dev 

如果你能找到一些庫read here