
如何在 Ubuntu 11.10 上建立較舊的 gcc(特別是 4.5.2)並避免有關「/usr/bin/ld: 找不到 crti.o: 沒有這樣的檔案或目錄」的錯誤?
我做了一些挖掘並發現了幾個類似的項目,但沒有一個能真正解決我的問題:
- 我已經驗證了我的所有軟體包(libc6-dev 等)都已重新安裝這個問題
- 我已經驗證 crti.o 存在於 /usr/lib32 和 /usr/lib/x86_64-linux-gnu 中,並且我的 ld.so.conf 配置為在這些目錄中查找
- 我已經驗證在 make 呼叫前添加 LIBRARY_PATH=/usr/lib/x86_64-linux-gnu 是可行的,但希望避免這種情況(它成為 makefile 中的分歧點)
- 我已經嘗試過使用 --with-build-sysroot 進行各種操作,但沒有成功(閱讀:也許我只是不知道要設定正確的標誌)
當使用 strace 運行時(根據這個答案),我可以看到對 crti.o 的裸露引用:
13240 open("crti.o", O_RDONLY) = -1 ENOENT(沒有這樣的檔案或目錄)
謝謝!
答案1
即使 GCC 的新版本也會失敗並顯示該訊息。這是因為新的 Debian/Ubuntu 版本(將)支援多架構(即在一個檔案系統中為多台機器安裝二進位),因此庫已從標準位置移開。
有 GCC 補丁可以修復它這裡(尚未批准最終版本,但對於 Ubuntu 來說是正確的),而且它們可能無需太多努力就可以適用於較舊的 GCC。我認為你需要設定 GCC--啟用多架構, 或其他的東西。
同時,建立軟連結是一個很好的修復方法:
cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .
(32 位元安裝上的資料夾名稱會有所不同)。
希望有幫助。
答案2
我有同樣的問題。從/usr/libs/crt?.o
到建立符號連結/usr/lib/x86_64-linux-gnu/crt?.o
為我解決了這個問題。
答案3
我透過一些可能對您有用的解決方法解決了這個問題。
首先,使用 建置 GCC LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
,以便建置引導程序知道在哪裡可以找到crt?.o
啟動檔。
然後,您可以將這三個檔案符號連結到與可執行檔安裝目錄相對應的目錄中,而不是在影響整個系統的地方建立符號連結crt?.o
。它會找到它們——但它們不會影響其他任何事情。/usr/lib
${prefix}/lib/gcc/...
${prefix}/bin
gcc
就我而言,將它們放入的特定目錄是lib/gcc/x86_64-unknown-linux-gnu/4.3.2/
;您可以找到合適的文件,因為它已經包含其他類似的文件crtbegin.o
。
答案4
我在 Ubuntu Precision x86_64 上建置了 GCC 4.1.2。正如您所做的那樣,我查看了最後一個命令“xgcc”的 strace,尋找 32 位元 c 運行時,grep-ped /32/ 如下。我的 C 執行時間位於 /usr/lib32 中,由 libc6-dev-i386 套件提供。
fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)
因此,我在 xgcc 查找的目錄中創建了 crt?.o 符號連結。
sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o
sudo ln -s /usr/lib32/crtn.o
sudo ln -s /usr/lib32/crti.o
我用它成功建構了 GCC 4.1.2。