我们想使用 crosstool-NG ct-ng 编译一个定义的 Linux x86 32Bit 工具链:
格利布 2.9
海湾合作委员会 4.8.4
我使用的是 ubuntu 14.04 32 位:
Linux ubuntu 3.16.0-30-generic #40~14.04.1-Ubuntu SMP 星期四 1月 15 17:45:15 UTC 2015 i686 i686 i686 GNU/Linux.
交叉工具NG失败,并显示:
Build failed in step 'Installing C library headers & start files'
编译时
/home/user/crosstool-x86-linux-32/.build/i386-unknown-linux-gnu/build/build-libc-startfiles/csu/crtn.o
汇编程序消息:
[ALL ] /tmp/ccCj5ny0.s: Assembler messages:
[ALL ] /tmp/ccCj5ny0.s:92: Error: can't resolve
.LFE8' {*UND* section} -
.LFB8' {UND 部分}(以及类似的错误...
在那个特定问题之前,我们遇到了类似的问题
../sysdeps/generic/initfini.c: Assembler messages:
../sysdeps/generic/initfini.c:123: Error: open CFI at the end of file; missing .cfi_endproc directive
../sysdeps/generic/initfini.c:123: Error: open CFI at the end of file; missing .cfi_endproc directive
我们暂时"修复"了在这篇文章中找到的目标/主机/构建标志中使用"-FNO-dwarf2-CFI-asm"的错误 http://www.openwall.com/lists/owl-dev/2011/10/18/4。
这把我们带到了这里...
我很想知道这个错误的来源是什么,除了 glibc 是旧的(可能是......
请参阅.config和build.log的附件 ct-ng。http://s000.tinyupload.com/download.php?file_id=60582934753963239188&t=6058293475396323918817262
我已经做了一段时间了,我通过修补 ./.build/src/glibc-2.9/sysdeps/i386/Makefile 解决了这个特殊问题:
ifeq ($(subdir),csu)
CFLAGS-initfini.s += -fno-unwind-tables -fno-asynchronous-unwind-tables
endif
ifeq ($(subdir),nptl)
CFLAGS-pt-initfini.s += -fno-unwind-tables -fno-asynchronous-unwind-tables
endif
修复后,我遇到了问题
[ALL ] make[3]: *** No rule to make target `.build/i386-unknown-linux-gnu/build/build-libc-final/nptl/pthread_spin_trylock.o', needed by `lib-noranlib'. Stop.
根据这篇文章:https://sourceware.org/ml/crossgcc/2012-06/msg00023.html通过将 CT_ARCH_CPU 和 CT_ARCH_TUNE 设置为 i686 来解决。
我的交叉工具-NG 版本 (crosstool-ng-1.21.0-41-gc45cfb5) 显示
Target-options->Tune for CPU
只有当
Target-options->Emit assembly for CPU
为空。我假设使用 mcpu 为 CPU 发出程序集可能会给我相同的结果。
为了避免此问题集(如上面的链接所示)
Target-options->Emit assembly for CPU
到 i686。