我是靠谱客的博主 明亮唇膏,最近开发中收集的这篇文章主要介绍交叉编译工具链,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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分半。




最后

以上就是明亮唇膏为你收集整理的交叉编译工具链的全部内容,希望文章能够帮你解决交叉编译工具链所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部