我建立使用GNU工具鏈的一個項目,直到我得到它聯繫起來,其中連接器抱怨說,它缺少/找不到crti.o
一切工作正常。這不是我的目標文件之一,它似乎與libc有關,但我不明白爲什麼它需要這個crti.o
,它不會使用庫文件,例如libc.a
?crti.o文件丟失
我正在爲手臂平臺交叉編譯。我有工具鏈中的文件,但我如何讓鏈接器包含它?
crti.o
是在'圖書館'搜索路徑之一,但它應該尋找庫路徑上的.o
文件?
是搜索路徑同樣爲gcc
和ld
?
我建立使用GNU工具鏈的一個項目,直到我得到它聯繫起來,其中連接器抱怨說,它缺少/找不到crti.o
一切工作正常。這不是我的目標文件之一,它似乎與libc有關,但我不明白爲什麼它需要這個crti.o
,它不會使用庫文件,例如libc.a
?crti.o文件丟失
我正在爲手臂平臺交叉編譯。我有工具鏈中的文件,但我如何讓鏈接器包含它?
crti.o
是在'圖書館'搜索路徑之一,但它應該尋找庫路徑上的.o
文件?
是搜索路徑同樣爲gcc
和ld
?
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
是感到困惑和你想看看它的開放來自路徑...
+1爲非常有用的strace技巧。但我的問題仍然沒有解決(交叉編譯ARM上的pjsip) – FractalSpace 2014-09-17 21:29:33
@FractalSpace它可能是一個不同的問題。你可以發佈你的輸出的問題嗎? – stsquad 2014-09-18 16:16:08
我得到同樣的問題,在Ubuntu默認安裝8.04。我必須手動獲取libc開發人員頭文件/文件才能工作。
好的,我不得不重新安裝工具鏈,以便包括丟失的文件。這似乎很奇怪,因爲它應該在gcc路徑上找到它。我猜想的主要問題是我的計算機上有15個左右不同的crti.o文件,並沒有指向正確的文件。不過,因爲不會使,但現在它工作:-)感謝您的幫助:-)
我有一個嚴重的建立交叉編譯器類似的問題。我周圍有像這樣:
/home/rob/compiler/usr/bin/arm-linux-gcc --sysroot=/home/rob/compiler hello.c
這假定/ lib目錄,/ usr/include目錄等所描述的地點由SYSROOT選項指向。這可能不是應該如何完成的,但是當我需要編譯一個簡單的C文件時,它使我擺脫了麻煩。
這解決了我(交叉編譯PJSIP爲ARM):
export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot'
我不得不同時交叉編譯同樣的問題。 crti.o在<sysroot>/usr/lib64但鏈接器不會找到它。
原來,創建一個空目錄<sysroot>/usr/lib修復了這個問題。看來,鏈接器將搜索路徑<SYSROOT>/usr/lib目錄第一,且僅當它存在,它甚至會考慮<SYSROOT>在/ usr/lib64下。
這是鏈接器中的錯誤嗎?或者這種行爲記錄在某處?
在我的情況Linux Mint 18.0/Ubuntu 16.04
,我沒有crti.o
可言:
$ find /usr/ -name crti*
我覺得沒有什麼,所以我安裝開發包:
sudo apt-get install libc6-dev
如果你能找到一些庫read here
對於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