【城市服务门户源码】【苹果手机siri源码】【文件转码源码大全】Newlib源码

时间:2024-11-26 12:37:16 来源:超强obv指标源码 分类:百科

1.make: *** [configure-target-libgcc] Error 1
2.如何为嵌入式开发建立交叉编译环境
3.rtems开发环境搭建
4.充分理解Linux GCC 链接生成的源码城市服务门户源码Map文件
5.newlib简介
6.平头哥玄铁e902仿真环境搭建

Newlib源码

make: *** [configure-target-libgcc] Error 1

       GCC源码版本: GCC 4.6.2,

       æœ¬åœ°GCC编译器版本:gcc (GCC) 4.6.3 (Fedora)

       ç¼–译配置: ../gcc-4.6.1/configure --target=$TARGET--prefix=$PREFIX --without-headers --enable-languages=c --disable-threads --disable-decimal-float --with-newlib --disable-shared--disable-libmudflap --disable-libssp

       #-----------------------------------#

       ä½ æƒ³å®‰è£…的是 4.6.2 还是4.6.1?

如何为嵌入式开发建立交叉编译环境

       ã€€ã€€ä¸‹é¢æˆ‘们将以建立针对arm的交叉编译开发环境为例来解说整个过程,其他的体系结构与这个相类似,只要作一些对应的改动。我的开发环境是,宿主机 i-redhat-7.2,目标机 arm。

       ã€€ã€€è¿™ä¸ªè¿‡ç¨‹å¦‚下

       ã€€ã€€1. 下载源文件、补丁和建立编译的目录

       ã€€ã€€2. 建立内核头文件

       ã€€ã€€3. 建立二进制工具(binutils)

       ã€€ã€€4. 建立初始编译器(bootstrap gcc)

       ã€€ã€€5. 建立c库(glibc)

       ã€€ã€€6. 建立全套编译器(full gcc)

       ã€€ã€€ä¸‹è½½æºæ–‡ä»¶ã€è¡¥ä¸å’Œå»ºç«‹ç¼–译的目录

       ã€€ã€€1. 选定软件版本号

       ã€€ã€€é€‰æ‹©è½¯ä»¶ç‰ˆæœ¬å·æ—¶ï¼Œå…ˆçœ‹çœ‹glibc源代码中的INSTALL文件。那里列举了该版本的glibc编译时所需的binutils 和gcc的版本号。例如在 glibc-2.2.3/INSTALL 文件中推荐 gcc 用 2.以上,binutils 用 2..1 以上版本。

       ã€€ã€€æˆ‘选的各个软件的版本是:

       ã€€ã€€linux-2.4.+rmk2

       ã€€ã€€binutils-2..1

       ã€€ã€€gcc-2..3

       ã€€ã€€glibc-2.2.3

       ã€€ã€€glibc-linuxthreads-2.2.3

       ã€€ã€€å¦‚果你选的glibc的版本号低于2.2,你还要下载一个叫glibc-crypt的文件,例如glibc-crypt-2.1.tar.gz。 Linux 内核你可以从www.kernel.org 或它的镜像下载。

       ã€€ã€€Binutils、gcc和glibc你可以从FSF的FTP站点ftp://ftp.gun.org/gnu/ 或它的镜像去下载。 在编译glibc时,要用到 Linux 内核中的 include 目录的内核头文件。如果你发现有变量没有定义而导致编译失败,你就改变你的内核版本号。例如我开始用linux-2.4.+vrs2,编译glibc-2.2.3 时报 BUS_ISA 没定义,后来发现在 2.4. 开始它的名字被改为 CTL_BUS_ISA。如果你没有完全的把握保证你改的内核改完全了,就不要动内核,而是把你的 Linux 内核的版本号降低或升高,来适应 glibc。

       ã€€ã€€Gcc 的版本号,推荐用 gcc-2. 以上的。太老的版本编译可能会出问题。Gcc-2..3 是一个比较稳定的版本,也是内核开发人员推荐用的一个 gcc 版本。

       ã€€ã€€å¦‚果你发现无法编译过去,有可能是你选用的软件中有的加入了一些新的特性而其他所选软件不支持的原因,就相应降低该软件的版本号。例如我开始用 gcc-3.3.2,发现编译不过,报 as、ld 等版本太老,我就把 gcc 降为 2..3。 太新的版本大多没经过大量的测试,建议不要选用。

       ã€€ã€€å›žé¡µé¦–

       ã€€ã€€2. 建立工作目录

       ã€€ã€€é¦–先,我们建立几个用来工作的目录:

       ã€€ã€€åœ¨ä½ çš„用户目录,我用的是用户liang,因此用户目录为 /home/liang,先建立一个项目目录embedded。

       ã€€ã€€$pwd

       ã€€ã€€/home/liang

       ã€€ã€€$mkdir embedded

       ã€€ã€€å†åœ¨è¿™ä¸ªé¡¹ç›®ç›®å½• embedded 下建立三个目录 build-tools、kernel 和 tools。

       ã€€ã€€build-tools-用来存放你下载的 binutils、gcc 和 glibc 的源代码和用来编译这些源代码的目录。

       ã€€ã€€kernel-用来存放你的内核源代码和内核补丁。

       ã€€ã€€tools-用来存放编译好的交叉编译工具和库文件。

       ã€€ã€€$cd embedded

       ã€€ã€€$mkdir build-tools kernel tools

       ã€€ã€€æ‰§è¡Œå®ŒåŽç›®å½•ç»“构如下:

       ã€€ã€€$ls embedded

       ã€€ã€€build-tools kernel tools

       ã€€ã€€3. 输出和环境变量

       ã€€ã€€æˆ‘们输出如下的环境变量方便我们编译。

       ã€€ã€€$export PRJROOT=/home/liang/embedded

       ã€€ã€€$export TARGET=arm-linux

       ã€€ã€€$export PREFIX=$PRJROOT/tools

       ã€€ã€€$export TARGET_PREFIX=$PREFIX/$TARGET

       ã€€ã€€$export PATH=$PREFIX/bin:$PATH

       ã€€ã€€å¦‚果你不惯用环境变量的,你可以直接用绝对或相对路径。我如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,这样当你logout或换了控制台时,就不用老是export这些变量了。

       ã€€ã€€ä½“系结构和你的TAEGET变量的对应如下表

       ã€€ã€€ä½ å¯ä»¥åœ¨é€šè¿‡glibc下的config.sub脚本来知道,你的TARGET变量是否被支持,例如:

       ã€€ã€€$./config.sub arm-linux

       ã€€ã€€arm-unknown-linux-gnu

       ã€€ã€€åœ¨æˆ‘的环境中,config.sub 在 glibc-2.2.3/scripts 目录下。

       ã€€ã€€ç½‘上还有一些 HOWTO 可以参考,ARM 体系结构的《The GNU Toolchain for ARM Target HOWTO》,PowerPC 体系结构的《Linux for PowerPC Embedded Systems HOWTO》等。对TARGET的选取可能有帮助。

       ã€€ã€€4. 建立编译目录

       ã€€ã€€ä¸ºäº†æŠŠæºç å’Œç¼–译时生成的文件分开,一般的编译工作不在的源码目录中,要另建一个目录来专门用于编译。用以下的命令来建立编译你下载的binutils、gcc和glibc的源代码的目录。

       ã€€ã€€$cd $PRJROOT/build-tools

       ã€€ã€€$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch

       ã€€ã€€build-binutils-编译binutils的目录

       ã€€ã€€build-boot-gcc-编译gcc 启动部分的目录

       ã€€ã€€build-glibc-编译glibc的目录

       ã€€ã€€build-gcc-编译gcc 全部的目录

       ã€€ã€€gcc-patch-放gcc的补丁的目录

       ã€€ã€€gcc-2..3 的补丁有 gcc-2..3-2.patch、gcc-2..3-no-fixinc.patch 和gcc-2..3-returntype-fix.patch,可以从 monly used with uClinux. uC-libc and

       uClibc. They are quite different despite their similar names. Here is a

       quick overview of how they are different.

       ã€€ã€€uC-libc is the original library for uClinux. It was based on sources

       from the Linux- C library which was part of the ELKs project with m

       support added by Jeff Dionne and Kenneth Albanowski. It is a fairly complete

       libc implementation, however, some of the API's are a little non-standard

       and quite a few common libc routines are not present. Currently it has

       stable support for m, ColdFire and ARM (Non-MMU) architectures. It was

       primary design goal is to be small and light weight. It does try to conform

       to any standards, although its API tries to be compatible with most libcs,

       it is not always exactly the same.

       ã€€ã€€The uClinux distribution provides an environment that can compile using

       either uC-libc or uClibc depending on your needs. For m and Coldfire

       platforms it is generally better to chose uC-libc as it supports shared

       libraries and is the most commonly used libc for these CPUs. uClibc also

       works quite well with almost all platforms supported by the distribution.

       Which libc you choose to use will be decided by your requirements

       uClinux有两个经常使用的libc库:uC-libc和uClibc。虽然两者名字很相似,其实有差

       åˆ«ï¼Œä¸‹é¢å°±ç®€å•çš„介绍一下二者的不同之处。uC -libc是最早为uClinux开发的库,是

       Jeff Dionne和Kenneth Albanowski为在EKLs项目中支持m在Linux- C库源码

       ä¸Šç§»æ¤çš„。uC-libc是一个完全的libc实现,但其中有一些api是非标准的,有些libc的

       æ ‡å‡†ä¹Ÿæ²¡æœ‰å®žçŽ°ã€‚uC-libc稳定地支持 m,ColdFire和没有MMU的ARM。其主要设计

       ç›®æ ‡æ˜¯â€œå°â€ã€"è½»",并尽量与标准一致,虽然它的API和很多libc兼容,但是似乎并

       ä¸åƒå®ƒæœŸæœ›çš„那样和所有标准一致。

       uClibc就是为了解决这个问题从uC-libc中发展出来的。它的所有API都是标准的(正确

       çš„返回类型,参数等等),它弥补了uC-libc中没有实现的libc标准,现在已经被移植到

       å¤šç§æž¶æž„中。一般来讲,它尽量兼容glibc以便使应用程序用uClibc改写变的容易。

       uClibc能够在标准的 VM linux和uClinux上面使用。为了应用程序的简洁,它甚至可以

       åœ¨è®¸å¤šæ”¯æŒMMU的平台上被编译成共享库。Erik Anderson在uClibc背后做了很多的工

       ä½œã€‚uClibc支持许多系列的处理器:m,Coldfire,ARM,MIPS,v, x,

       i,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不断增加的平台支持显示uClibc

       èƒ½å¤Ÿå¾ˆå®¹æ˜“的适应新的架构。uClinux发行版提供了环境能够让你选择使用uC-libc或是

       uClibc编译。对于m和Coldfire平台来说,选择uC-libc还是稍微好一点,因为它

       æ”¯æŒå…±äº«åº“,而共享库是这些cpu经常使用的 libc.uClibc也几乎和所有的平台都能很

       å¥½çš„工作。选择哪种libc取决于你的需求。

       newlib 是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组

       æˆï¼Œç‰¹ç‚¹æ˜¯è½»é‡çº§ï¼Œé€Ÿåº¦å¿«ï¼Œå¯ç§»æ¤åˆ°å¾ˆå¤šCPU结构上。newlib实现了许多复杂的功

       èƒ½ï¼ŒåŒ…括字符串支持,浮点运算,内存分配(如malloc)和I/O流函数(printf,fprinf()

       ç­‰ç­‰)。其中libc提供了c 语言库的实现,而libm提供了浮点运算支持。

       åœ¨ä¸ºARM交叉编译gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,

       gcc编译器默认使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),当使用

       --with-newlib时,gcc编译器不使用Glibc。当没有交叉编译Glibc时,可以使用

       --with-newlib禁止连接Glibc而编译bootstrap gcc编译器。从gcc源目录下的

       config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影响gcc连接C语言

       åº“,t-linux(--target=arm-linux)默认使用Glibc,-arm-elf(--target=arm-elf)使用

       - Dinhibit_libc禁止连接Glibc,这时我们就可以使用newlib等其他C语言库编译GCCå·¥

       å…·é“¾ã€‚

       è™½ç„¶GCC工具链配置了不同的的C语言库,但由于这些C语言库都可以用来支持GCC,它们

       å¯¹æ ¸å¿ƒæ•°æ®çš„处理上不存在较大出入。因而arm-linux-* 和 arm-elf-*区别主要表现在

       C语言库的实现上,例如不同系统调用,不同的函数集实现,不同的ABI\启动代码以及

       ä¸åŒç³»ç»Ÿç‰¹æ€§ç­‰å¾®å°çš„差别。

       arm-linux-*和 arm-elf-*的使用没有一个绝对的标准,排除不同库实现的差异,gcc可

       ä»¥ç¼–译任何系统。arm-linux-*和 arm-elf-*都可以用来编译裸机程序和操作系统,只

       æ˜¯åœ¨éµå¾ªä¸‹é¢çš„描述时系统程序显得更加协调:

       arm-linux-*针对运行linux的ARM机器,其依赖于指定的C语言库Glibc,因为同样使用

       Glibc的linux而使得arm-linux-*在运行linux的ARM机器上编译显得更加和谐。

       arm-elf-*则是一个独立的编译体系,不依赖于指定的C语言库Glibc,可以使用newlib

       ç­‰å…¶ä»–C语言库,不要求操作系统支持,当其使用为嵌入式系统而设计的一些轻巧的C语

       è¨€åº“时编译裸机程序(没有linux等大型操作系统的程序),如监控程序,bootloader等

       èƒ½ä½¿å¾—系统程序更加小巧快捷。

       Linaro prebuilt toolchain does support both hard and soft floating

       point. You can get it from /linaro-toolchain-binaries/+milestone/. try: ./arm-linux-gnueabihf-gcc -print-multi-lib

       The default configure is --with-arch=armv7-a --with-tune=cortex-a9

       --with-fpu=vfpv3-d --with-float=hard --with-mode=thumb

       To use soft floating, you need options: -marm -march=armv4t -mfloat-abi=soft.

       In your case, please try to change -march=armv5 to "-march=armv4t"

       If you want to change to configure to cortex-a8 and armv5. You need

       * Change cortex-a9 to cortex-a8 in

       samples/linaro-arm-linux-gnueabihf/crosstool.config

       * Change armv4t to armv5 in

       contrib/linaro/patches/gcc/linaro-4.7-./multilib.patch,

       Then follow the instructions to rebuild the toolchain

       (contrib/linaro/doc/README.txt)

       BTW: crosstool-ng-linaro does not support multilib for eglibc. It uses

       the prebuilt sysroot from Ubuntu Precise. If it does not work for you,

       please use the latest crosstool-ng from http://crosstool-ng.org/.