這需要很長時間才能解釋,但簡短的版本是我目前正試圖編譯ARMv7的LLVM GCC前端以編譯應用程序Cortex-A8(iPhone 3GS)。編譯libgcc(gcc編譯過程的一部分)時,我遇到了LD中的一個錯誤,這個錯誤一直讓我發瘋!GCC 4.2.1用於iPhone的Cygwin(Win7 64bit)編譯
的命令是這樣的:
/usr/llvm-gcc-4.2-2.8.source/build/./gcc/xgcc \
-B/usr/llvm-gcc-4.2_2.8.source/build/./gcc \
-B/usr/local/arm-apple-darwin/bin \
-B/usr/local/arm-apple-darwin/lib \
-isystem /usr/local/arm-apple-darwin/include \
-isystem /usr/local/arm-apple-darwin/sys-include \
-O2 -g -W -Wall -Wwrite-strings -wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -fno-inline -dynamiclib -nodefaultlibs -W1,-dead_strip \
-marm \
-install_name /usr/local/arm-apple-darwin/lib/libgcc_s.1.dylib \
-single_module -o ./libgcc_s.1.dylib.tmp \
-W1,-exported_symbols_list,libgcc/./libgcc.map
-compatibility_version 1 -current_version 1.0
-DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -Dinhibit_libc \
... long list of .o files ... \
-lc
而結果通常是很多的malloc,自由,退出等不確定引用這通常表示的libc不獲取編譯通過後去。 ld正在拋出的錯誤列表,我在頂部看到它正試圖拉入/usr/lib/libc.a並抱怨它不是正確的平臺。好吧,這很有道理,所以我花了5分鐘在谷歌上找到了答案。原來,如果我複製libSystem.dylib並將其重命名爲libc.dylib,那應該可以解決問題,但它不會。我無法在手機上找到該文件的副本,因此我直接從SDK中將其取出。然後我得到這個奇怪的錯誤:
ld64: in /usr/local/arm-apple-darwin/lib/libc.dylib, can't re-map file, errno=22
在這一點上,我做了我能想到的一切。我從我的iphone中抓取了我的/ usr/lib文件夾的新副本,並確認libSystem.dylib(和libSystem.B.dylib)不在那裏。我爲iOS 4.2.1解壓原始的.ipsw包,並且再次找不到libSystem.dylib的副本。我解開了iPhoneSDK和MacOS SDK的包裝,我設法找到了它的一個副本,但是這個錯誤只是持續存在。我複製了libSystem.dylib,libSystem.B.dylib,嘗試了重命名到libc.dylib的各種組合,並且仍然只是錯誤。我無法找到一種方法讓它識別文件並與之鏈接。我也嘗試鏈接到位於iPhone SDK中的libc.a,但也沒有工作。我檢查了./xgcc正在發射什麼,這是我新建的arm-apple-darwin-ld64的副本,應該沒問題。
這裏有一點背景。我構建了LLVM + Clang 2.8,沒有出現任何錯誤,我重新修改了ODCCTools,並對其進行了一些修改,以便在Cygwin上編譯(如果能夠使其工作,我會將修改與補丁一起發佈到補丁中)。我還抓住了iphone-dev「includes」和「csu」項目以及那些成功完成的項目,雖然它們確實沒有意義,因爲我無法使它與crt0.a鏈接。我在這裏沒有想法了。
任何人都可以幫我解決這個問題嗎?
我應該注意我已經多次檢查過命令行,並且我已經驗證了-l和庫之間沒有空格(谷歌上的每個搜索都表明這是錯誤) – 2011-03-07 15:17:25