【影音全套源码】【在线crm源码】【unmarshal源码解读】armlinuxgcc源码

来源:推金币源码

1.如何制作arm-linux-gcc编译工具
2.Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器
3.如何安装gcc-linaro-arm-linux-gnueabihf-4.8-2014.03
4.如何安装arm-linux-gcc
5.arm-linux-gcc 和 arm-elf-gcc 的区别
6.gcc和arm-linux-gcc是什么关系?区别是什么?

armlinuxgcc源码

如何制作arm-linux-gcc编译工具

       ä¸€ã€ä¸‹è½½æºæ–‡ä»¶

       æºä»£ç æ–‡ä»¶åŠå…¶ç‰ˆæœ¬ï¼š

       binutils-2..tar.bz2, gcc-core-4.4.4.tar.bz2 gcc-g++-4.4.4.tar.bz2 Glibc-2.7.tar.bz2 Glibc-ports-2.7.tar.bz2 Gmp-4.2.tar.bz2 mpfr-2.4.0.tar.bz2mpc-1.0.1.tar.gz Linux-2.6..tar.bz2 (由于我在编译出错的过程中,根据出错的信息修改了相关的C代码,故而没有下载相应的补丁)

       ä¸€èˆ¬ä¸€ä¸ªå®Œæ•´çš„交叉编译器涉及到多个软件,主要包括bilinguals、cc、glibc等。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具,而glibc主要提供用户程序所需要的一些基本函数库。

       äºŒã€å»ºç«‹å·¥ä½œç›®å½•

       ç¼–译所用主机型号 fc.i,虚拟机选的是VM7.0,Linux发行版选的是Fedora9,

       ç¬¬ä¸€æ¬¡ç¼–译时用的是root用户(第二次用一般用户yyz), 所有的工作目录都在/home/yyz/cross下面建立完成,首先在/home/yyz目录下建立cross目录,然后进入工作目录,查看当前目录。命令如下:

       åˆ›å»ºå·¥å…·é“¾æ–‡ä»¶å¤¹ï¼š

       [root@localhost cross]# mkdir embedded-toolchains

       ä¸‹é¢åœ¨æ­¤æ–‡ä»¶å¤¹ä¸‹å»ºç«‹å¦‚下几个目录:

       setup-dir:存放下载的压缩包;

       src-dir:存放binutils、gcc、glibc解压之后的源文件;

       Kernel:存放内核文件,对内核的配置和编译工作也在此完成;

       build-dir :编译src-dir下面的源文件,这是GNU推荐的源文件目录与编译目录分离的做法;

       tool-chain:交叉编译工具链的安装位;

       program:存放编写程序;

       doc:说明文档和脚本文件;

       ä¸‹é¢å»ºç«‹ç›®å½•ï¼Œå¹¶æ‹·è´æºæ–‡ä»¶ã€‚

       [root@localhost cross] #cd embedded- toolchains

       [root@localhost embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc

       [root@localhost embedded- toolchains] #ls

       build-dir doc kernel program setup-dir src-dir tool-chain

       [root@localhost embedded- toolchains] #cd setup-dir

       æ‹·è´æºæ–‡ä»¶ï¼š

       è¿™é‡Œæˆ‘们采用直接拷贝源文件的方法,首先应该修改setup-dir的权限

       [root@localhost embedded- toolchains] #chmod setup-dir

       ç„¶åŽç›´æŽ¥æ‹·è´/home/yyz目录下的源文件到setup-dir目录中,如下图:

       å»ºç«‹ç¼–译目录:

       [root@localhost setup-dir] #cd ../build-dir

       [root@localhost build -dir] #mkdir build-binutils build-gcc build-glibc

       ä¸‰ã€è¾“出环境变量

       è¾“出如下的环境变量方便我们编译。

       ä¸ºç®€åŒ–操作过程。下面就建立shell命令脚本environment-variables:

       [root@localhost build -dir] #cd ../doc

       [root@localhost doc] #mkdir scripts

       [root@localhost doc] #cd scripts

       ç”¨ç¼–辑器vi编辑环境变量脚本envionment-variables:[root@localhost scripts]

       #vi envionment-variables

       export PRJROOT=/home/yyz/cross/embedded-toolchains

       export TARGET=arm-linux

       export PREFIX=$PRJROOT/tool-chain

       export TARGET_PREFIX=$PREFIX/$TARGET

       export PATH=$PREFIX/bin:$PATH

       æˆªå›¾å¦‚下:

       æ‰§è¡Œå¦‚下语句使环境变量生效:

       [root@localhost scripts]# source ./environment-variables

       å››ã€å»ºç«‹äºŒè¿›åˆ¶å·¥å…·ï¼ˆbinutils)

       ä¸‹é¢å°†åˆ†æ­¥ä»‹ç»å®‰è£…binutils-2..1的过程。

       [root@localhost script] # cd $PRJROOT/src-dir

       [root@localhost src-dir] # tar jxvf ../setup-dir/binutils-2..1.tar.bz2

       [root@localhost src-dir] # cd $PRJROOT/build-dir/build-binutils

       åˆ›å»ºMakefile:

       [root@localhost build-binutils] #../../src-dir/binutils-2..1/configure --target=$TARGET --prefix=$PREFIX

       åœ¨build-binutils目录下面生成Makefile文件,然后执行make,make install,此过程比较缓慢,大约需要一个分钟左右。完成后可以在$PREFIX/bin下面看到我们的新的binutil。

       è¾“入如下命令

       [root@localhost build-binutils]#ls $PREFIX/bin

Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器

       在编译Ubuntu驱动时,由于使用的gcc版本为7.3.0,通过apt管理和下载都无法直接安装,因此需要从源码编译安装gcc7.3.0编译器。

       GCC,作为GNU项目的影音全套源码重要组成部分,是一款遵循GPL许可证的自由软件。起初,它为GNU操作系统设计,如今已广泛应用于Linux、BSD、MacOS X等系统,甚至在Windows上也有应用。GCC支持多种处理器架构,如x、ARM和MIPS,并且支持多种编程语言,在线crm源码如C、C++、Fortran、Pascal等。

       要从源码安装gcc7.3.0,首先需要下载源码包。下载地址为:mirrors.tuna.tsinghua.edu.cn...

       安装过程分为几个步骤。首先,unmarshal源码解读确保网络连接,因为需要依赖库,如libgmp-dev、libmpfr-dev和libmpc-dev。安装完这些后,不要卸载已有的gcc,因为可能会遇到问题。

       下载并解压gcc-7.3.0.tar.gz,github强国源码然后执行./configure。注意增加c和c++的配置,避免编译结果只有g++。配置完成后,进行make -j4编译,可能会遇到错误,如"fatal error: asm/errno.h: No such file or directory",这时需要修改头文件路径。VLAN软件源码

       继续编译,可能会遇到"sanitizer_syscall_generic.inc::: error: '__NR_open' was not declared in this scope",解决方法是修正头文件链接。最后,编译成功后执行sudo make install,并确认安装版本。

       在安装过程中,有两点需要注意:一是本地需要g++,否则编译时会出错,解决方法是安装gcc;二是安装后可能只有g++,没有gcc,此时需在./configure阶段添加c和c++的配置。

如何安装gcc-linaro-arm-linux-gnueabihf-4.8-.

       1、 如果要自己编译工具链,从以下链接下载源码

       crosstools-ng下载地址

       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/.

gcc和arm-linux-gcc是什么关系?区别是什么?

       gcc是linux系统下面用来将代码编译成一个可执行程序的手段。编译出来的是适用于linux系统的可执行二进制文件。可执行程序其实就是一堆的二进制机器码。这些机器码代表什么含义只有机器本身能理解。所以你用gcc编译出来的可执行程序只有在linux系统下面可以运行。举个例子你的可执行程序里面有一句.这句在linux下面可能是吃饭的意思,但是在windows下面可能是撒尿的意思。那你说linux的可执行程序放在window下面能正常运行吗?肯定不能嘛。你要的目的是吃饭,它帮你执行撒尿很显然就不对了。同样的可能在ARM下面的意思是睡觉。不同系统的机器码含义是不一样的。所以你在linux系统下面写的代码要怎样才能在ARM系统上面跑呢。这就需要用到交叉编译。arm-linux-gcc是什么意思?就是告诉你的编译器,我编写的环境是linux,但是我希望生成的可执行程序是在arm上面跑的。这就是交叉编译。编写环境和执行环境分离的一种手段。

文章所属分类:综合频道,点击进入>>