编译工具链:https://sourceforge.net/projects/uclinux/files/Tools/里有arm-uclinuxeabi-20160831
uclinux : uClinux-dist-20160919.tar.bz2。
因为没有CORTEX-M 支持,因此选择了设备 /vendors/Atmel/at91sama5d3。
编译,在编译到uClinbc库时,出现 共享库需要指定库ID错误,找遍网络,没有找到解决思路。
于是又回过头,使用arm-linux-gnueabi工具链,配置uClinux使用gLibc库,编译uCLinux。
编译到glibc库时,编译工具自动下载相关的包,打补丁,配置并编译。期间碰到了很多问题,但最终还是解决了,主要两类:
1)使用的工具没有下载。
根据提示,从网络上下载
2)部分代码和Makefile需要修改,才能编译通过。
只记录了如下:
a)
/tmp/cc6APNmN.s: Assembler messages:
/tmp/cc6APNmN.s: Error: `loc1@GLIBC_2.17' can't be versioned to common symbol 'loc1'
/tmp/cc6APNmN.s: Error: `loc2@GLIBC_2.17' can't be versioned to common symbol 'loc2'
/tmp/cc6APNmN.s: Error: `locs@GLIBC_2.17' can't be versioned to common symbol 'locs'
../o-iterator.mk:9: recipe for target '/tmp/output/build/glibc-2.25/build/misc/regexp.os' failed
修改
++char *loc1 __attribute__ ((nocommon));
++char *loc2 __attribute__ ((nocommon));
++char *locs __attribute__ ((nocommon));
b)
/home/dx/uclinux/uClinux-dist/glibc/install/include/bits/stdio2.h:33:10: error: invalid use of '__builtin_va_arg_pack ()'
在编译选项中增加:-fgnu89-inline
c)
acc错误是宏定义不严谨
出现错误地方增加强制转换,确保无符号和有符号,以及符号扩展的正确性。
d)
很多警告都按照错误处理
修改Makefile中的编译选项,将-Werror注释掉。
代码应该没有问题,主要是语法不严谨,与编译GCC的版本不匹配造成的。
完成了使用glibc库的uClinux编译后,有了一点成就感。于是还是想使用uClibc来编译uClinux.
重新配置使用我自己编译的工具链,还是编译到uClibc库时出现错误。哈哈,侧面说面我编译的工具链还是可以用的喔。还是有一点小小的成就感。
再恢复到官网提供的工具链。
因为网上没有有效的信息,只要将执行命令打印出来,查看链接工具的帮助信息,花了我好几天的功夫,还终于解决了指定共享库ID的错误。
但是编译到libc库时,出现链接之前编译出的uclibc共享库的文件格式(BFLT V4)不识别。这太让人气馁了。用同一个工具链生成的文件,居然还不识别。是不是工具链有问题喔。
但还是耐着性子去看ld-elf2flt的资料,尝试配置内核支持BFLT(居然没有找到,奇怪了) , 都没有成功。
一点头绪都没有,我简直觉得走不下去了。
但我还是想再试试,重新配置设备为/vendors/ARM/Versatile-PB-noMMU。重新编译。
居然一口气编译到genromfs。 我头都大了,难道又碰到啥莫名其妙的问题了????。仔细一看,原来是没有安装对应的工具。安装工具后,再编译,一次成功。
走了那么多天的弯路,如此轻松的就搞定了,真是山重水复疑无路,柳暗花明又一村。
看来,最新的工具链、Uclinux系统只与新添加的设备是匹配的。(Versatile-PB-noMMU是上个版本之后才添加的)。
这里要吐槽一下uClinux的维护团队了。每个发布的稳定版本,最好一起发布配套的工具链,以及说明配套工具链可成功编译的设备吧。
使用Versatile-PB-noMMU编译出的uclinux,还是参考QEMU-ARM-VERSATILE-HOWTO
You can run in no-MMU mode on the Versatile board too. It is basically the
same as running the normal VM kernel. Build for the ARM/Versatile-PB-noMMU
target.
qemu-system-arm -M versatilepb -nographic -kernel images/zImage -append "console=ttyAMA0,115200"
运行进行跟踪和分析。
至此,嵌入式LINUX系统编译过程已打通了,为后续熟悉引导、加载操作系统和文件系统等研究,建立基础。