交叉编译工具链

本文详细记录了解决GCC和glibc编译过程中遇到的问题,包括头文件安装错误、内核版本不兼容、缺少依赖库等问题的解决方法。通过调整配置选项和正确导出目标头文件,最终成功编译glibc,并提供了从头文件到配置选项的详细步骤,为后续类似问题提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GCC还好说,make all-host很顺利,工具都编出来了,但all-target编译不成功,连libgcc都编不出来,不知道为什么这些GCC的底层库需要target的C库。安装这些工具已经可以正常编译内核了,虽然不知道为什么最后编出来的内核在虚拟机里跑不了。


最后参照lfs里命令选项,尽可能不编译库,最后果然成功了。


下面是编译glibc,开始连configure都过不了,报不支持forced unwind。打开log一看,它想用target编译器编个test程序,target gcc报找不到运行时库crti.o等。我不就是为了打造一个C库才编译glibc么,尼玛凭什么假定我已经有一个完整的库了?后来再次参照lfs,configure设置几个选项,不让configure去测试这么功能。最后成功configure过。lfs是个好东西。


编译,报错:

In file included from ../sysdeps/unix/sysv/linux/x86_64/sysdep.h:25:0,
                 from <stdin>:1:
../nptl/sysdeps/x86_64/tls.h:23:48: fatal error: asm/prctl.h: No such file or directory
compilation terminated.

内核头文件是我自己make headers_install安装的。安装时指定目录不需要指定到include级,但传给glibc的参数要指定到include级。

至于这个问题,是我安装头文件时忘应该导出target 头文件而不是host头文件,要target配置及ARCH=$target才能正确导出target头文件。


再来,又出错。

../sysdeps/unix/sysv/linux/msgsnd.c: In function '__libc_msgsnd':
../sysdeps/unix/sysv/linux/msgsnd.c:37:1: error: '__NR_ipc' undeclared (first use in this function)
../sysdeps/unix/sysv/linux/msgsnd.c:37:1: note: each undeclared identifier is reported only once for each function it appears in


这个看起来是我的内核头文件太新了,uapi的位置好像经历了一次变化。我用的glibc是12年12月份的版本,只好切到于当时而言比较近的版本3.6.


再来,还出错,报undefined reference to `__stack_chk_guard',真折腾啊。看起来像stack protecor相关的问题,网上说编译gcc时要加入libssp的支持在,是lfs上说要关掉这个。确实,打开这个开关以后编译gcc报错,因为没有那时还没有C库,又是循环依赖!!lfs上其实提到这个问题,它的解决办法是改gcc配置文件,让内置的libgcc.a提供stack protector的功能。但为什么要改配置文件?为什么不在配置glibc时不要使用这个特性?网上搜一下,果然,可以在配置glibc时加入libc_cv_ssp='no' 。


再来,终于成功啦。编译glibc的时间比gcc的还长,花了3分半;编gcc才花了2分半。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值