uclinx 编译心得二

编译工具链: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系统编译过程已打通了,为后续熟悉引导、加载操作系统和文件系统等研究,建立基础。










你可能感兴趣的:(uclinx 编译心得二)