这需要很长时间才能解释,但简短的版本是我目前正试图编译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