读书笔记《Building embedded linux system》Chapter 4 开发环境

来源:互联网 发布:网络资源库尔雅 编辑:程序博客网 时间:2024/05/22 05:03

toolchain这个词不好翻译,姑且译为工具链。O'Reilly建议,即使我们的开发机和target是相同的结构(例如都是x86),仍然建议使用通用的工具链作为跨平台的开发环境,不使用在开发机上自带的工具链,这是为了保证工具链和特定的工作站环境无关,使得工作站软件升级后不会引起在我们的嵌入式应用崩溃,另外可以使用一些针对target的更好的更有效的工具,例如另一个新的C库。有一些厂家提供嵌入式Linux包的同时也提供了开发环境,另一些硬件厂家也提供基于他们的工具链。有一种方式是使用Eclips的开发环境,在上面增加plug-ins提供硬件的debugger,允许配置root文件系统和内裤,使用JAVAGUI。O'Reilly也不建议初学者使用Cynwin作为开发环境。

给出一个开发环境的组织结构(文件夹的组织)。第一层各个模块,分别怎对不同的target建立,例如我们可建立一个netbook-module和mid-module,在下面建立bootldr/、build-tool/、debug/、doc/、images/、kernel/、project/、rootfs/、sysapps/、tmp/、tools/。这些当然不是僵硬的,只是提供一些组织的建议,有些厂家提供的开发环境会有自己的组织方式。要区分开源软件以及你自己的code。建议我们区分工作者所自带的开发环境和我们自己的开发环境,不用轻易使用root来执行,避免影响自带的GNU工作链。


GNU跨平台工具链

对于build、host和target,我们在GNU的配置文件中,使用cpu-manufacturer-kernel-os来进行命名。对于cpu如果是litter-endian,使用加上el。kernel是可选。例如i386-pc-linux-gun,powerpc-8540-linux-gnu-gcc。

工具链是一系列用于build的软件工具。包括linker、assembler、archiver、C complier、C lib、C header。在linux2.6之前的版本,在include/asm-architecture和include/linux中有所有kernel的头文件,但是在2.6版本以后,认为不是所有的都适合用于用户开发,而且容易造成用户程序的崩溃,因此提供了一个经过整理的linux kernel的头文件。我的linuxkernel是2.6.24,uname-r来查看具体的版本,进入/usr/src/linux-headers-2.6.24-23-generic目录。我的target也是x86的版本,因此使用sudo make ARCH=x86 INSTALL_HDR_PATH=header/ headers_install,将生成/usr/src/linux-headers-2.6.24-23-generic/headers/include的目录,里面就是经过整理的清洁的头文件。

工具链包括Binutils,二进制工具,例如as、ar、ld这些我们熟悉,还有gasp/nmu/objcopy/objdump/ranlib/readelf/size/strings/strip/c++filt/addr2lin2。工具链包括著名的C库glibc。glibc是个完整的强健的C库,对于嵌入式操作系统,他的模块化不很好,基本上不可能删减,因此对于执行程序,会导致size比较大,使用其他的C库,可能会减少50%的size,这对于Flash容量很小的设备需要主意。不过现在存贮越来愈大,这个问题也将被会成为问题。工具链包括线程库,早期我们先线程的时候,需要下载pthread的lib来支持,在2.6版本之前,内核对线程不怎么支持,在2.6.16版本之后,内核对线程的支持比较稳定和强健,能支持千数量级的线程,这个线程库是NPTL(New POSIX ThreadingLibrary)。如果我们的嵌入式操作系统的版本比较旧或者我们不需要大量的线程,可以使用LinuxThreads库,如果可能,转向使用NPTL。

建立我们的工具链要选择各个工具,包括GCC、glibc、binutils,合适的版本。这些工具都是独立维护和发布的,但它们是关联的,所有我们要选择合适的版本,是他们都稳定地跑起来。通常我们都会选择最新的版本,但是有时最新的版本不一定是稳定的版本,这是我们就要选择上一个版本,以此类推。有时后改动某个工具的版本,也需要其他工具版本进行改动。当我们这些版本可以在host上正常编译,不代表一定能在target上正常地运行。书中的例子。使用glibc2.2.3,GCC2.95.3可以在x86的host上build成功,但在PPC的target上出现coredump,需要将glibc降低到glibc2.2.1。所以版本的问题是需要注意的,甚至有时后在同一个系统的target上,有些CPU能跑,有些CPU不能跑。书中又举了个例子,不过这个例子是在新的版本中得到修复,而不是回退。上面的例子中GCC的版本也太低了。有可能,我们应选择更新的版本。我查了一下我的阿土上面的版本:GlibC为 2.7(命令:ldd -version),gcc为4.2.4(命令:gcc-v),binutil为2.18.1。Moblin2上面的版本可参见http://moblin.org/documentation/moblin-sdk/moblin-v2-development-libraries。当前moblin2的binutil版本为2.19,glibc的版本为2.9。我觉得moblin2上面的版本太新了。

接着介绍了几个工具链的环境,虽然这部书是去年出的,计算机的发展很快,现在的版本比较高,有些step by step的步骤已经改变。我想这部分在实战的过程中在进一步的深入。

原创粉丝点击