标签:ecif roo 令行 ued ros 图片 上进 set static
默认安装的 GCC 编译系统所产生的代码适用于本机,即运行 GCC 的机器,但也可将 GCC 安装成能够生成其他的机器代码。安装一些必须的模块,就可产生多种目标机器代码,而且可通过命令行选择一种希望使用的代码。
从网站 http://gcc.gnu.org/install/specific.html 可以得到有可能的最新目标机列表。在此站点中可找到更新过的目标机列表,以及向各种目标机进行移植的最新信息。关于每种可能的目标机都有一个简短介绍,可以查找说明得到有关移植的一些特殊需求。已知目标的列表非常长,而且也总在加入一些新端口。
当前已经不需要我们从源码上进行编译安装一个交叉编译器了,我们可以通过工具crosstool-ng 或是 buildroot 工具来进行交叉编译器的制作
可以在官网上面直接下载
官网:http://crosstool-ng.github.io/
也可以通过git命令直接进行clone下载:
git clone https://github.com/crosstool-ng/crosstool-ng
直接执行git clone命令会在你的工作目录中建立一个crosstool-ng目录,里面存放的是源码。
可以进入如下网站查看具体的安装帮助信息:http://crosstool-ng.github.io/docs/
安装成功后,执行 ct-ng 命令会打印如下信息:
建立工作文件夹:
rk3399@rk3399:~/work/tools/toolchain$ mkdir S3C2440_work src S3C2440
执行命令:ct-ng list-samples
里面会列出很多的交叉编译工具样本。介绍ARM的几种:
S3C2440选择arm-unknown-linux-gnueabi 此种编译器。
所有的支持的编译器存放在rk3399@rk3399:~/work/tools/crosstool-ng/samples 此目录下。将其arm-unknown-linux-gnueabi 中的文件拷贝到我们建立的S3C2440_work目录下。
进入S3C2440_work目录中,将crosstool.config 文件改名为 .config,然后执行 ct-ng menuconfig命令进行配置
架构和处理器名称,可以在芯片手册的方框图中找到,如下:
执行命令 ct-ng build 即可开始编译。
制作完成会打印出下面的语句:
基本步骤与上面类似,不同的是在crosstool-ng中编译器的选择方面和工程配置上面。
Exynos 4412 选择的是 arm-cortexa9_neon-linux-gnueabihf 编译器,exynos 4412本身就是带neon的,处理器本身就是属于cortexa9系列。
配置上只是更改下Target options 中的内容:
之后就是保存编译了。
编译程序是一个翻译器。它读入一种语言格式的指令(通常是文本形式的编程语言),并将它们翻译成可在计算机上运行的指令集合(通常是二进制硬件指令的集合)。
例子:gcc -ansi -c muxit.c -o muxit.o
GCC 是由许多组件组成的,但它们也并不总是出现的。有些部分是和语言相关的,所以如果没有安装某种特定语言,系统中就不会出现相关的文件。
组件 |
描述 |
c++ |
gcc 的一个版本,默认语言设置为 C++,而且在连接的时候自动包含标准 C++库。这和g++一样 |
cc1 |
实际的 C 编译程序 |
cc1plus |
实际的 C++编译程序 |
collect2 |
在不使用 GNU 连接程序的系统上, 有必要运行 collect2 来产生特定的全局初始化代码 (例如 C++的构造函数和析构函数) |
configure |
GCC 源代码树根目录中的一个脚本。用于设置配置值和创建 GCC 编译程序必需的 make程序的描述文件 |
crt0.o |
这个初始化和结束代码是为每个系统定制的,而且也被编译进该文件,该文件然后会被连接到每个可执行文件中来执行必要的启动和终止程序 |
cygwin1.dll |
Windows 的共享库提供的 API,模拟 UNIX 系统调用 |
f77 |
该驱动程序可用于编译 Fortran |
f771 |
实际的 Fortran 编译程序 |
g++ |
gcc 的一个版本,默认语言设置为 C++,而且在链接的时候自动包含标准 C++库。这和 c++ 是一样的 |
gcc |
该驱动程序用于执行编译程序和连接程序以产生需要的输出 |
gcj |
该驱动程序用于编译 Java |
gnat1 |
实际的 Ada 编译程序 |
gnatbind |
一种工具,用于执行 Ada 语言绑定 |
gnatlink |
一种工具,用于执行 Ada 语言连接 |
jc1 |
实际的 Java 编译程序 |
libgcc |
该库包含的例程被作为编译程序的一部分,是因为它们可被连接到实际的可执行程序中。它们是特殊的例程,连接到可执行程序,来执行基本的任务,例如浮点运算。这些库中的例程通常都是平台相关的 |
libgcj |
运行时库包含所有的核心 Java 类 |
libobjc |
对所有 Objective-C 程序都必须的运行时库 |
libstdc++ |
运行时库,包括定义为标准语言一部分的所有的 C++类和函数 |
GCC的命令很多,常用的选项如下:
选项 |
描述 |
-c |
只编译不链接。 会明确指示 GCC 去编译源代码,在硬盘上留下目标文件,且跳过将目标文件连接到可执行程序这一步。 缺省情况下, GCC通过用`.o‘替换源文件名后缀`.c‘, `.i‘, `.s‘,等产生目标文件名.可以使用-o选项选择其他名字. GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编). 如:gcc -c hello.c |
-o file |
指定输出的文件名 如果没有使用 `-o‘ 选项,默认的输出结果是:可执行文件为`a.out‘。如gcc -c hello.c -o hello.o |
-x language |
明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).这个选项应用于后面 所有的输入文件,直到遇着下一个`-x‘选项. language的可选值有`c‘, `objective-c‘, `c-header‘, `c++‘, `cpp-output‘, `assembler‘,和`assembler-with-cpp‘. |
-x none |
关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过`-x‘选项). 如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x‘选项(或文件名后缀)告诉 gcc从哪里开始,用`-c‘, `-S‘,或`-E‘选项告诉gcc到 哪里结束.注意,某些选项组合(例如, `-x cpp-output -E‘)使gcc不作任何事情. |
-S |
指示编译程序生成汇编语言代码,然后停止。 缺省情况下, GCC通过用 `.o‘ 替换源文件名后缀 `.c‘、`.i‘ 等等,产生 目标文件名。可以使用-o选项选择其他名字。 汇编语言的形式依赖于编译程序的目标平台。如果编译多个源文件,会为每个源文件都生成一个汇编语言模块。 GCC忽略任何不需要编译的输入文件。 gcc -S helloworld.c |
-E |
预处理后即停止,不进行编译。预处理后的代码送往标准输出 GCC忽略任何不需要预处理的输入文件. gcc -E helloworld.c gcc -E helloworld.c -o helloworld.i |
-C |
告诉预处理器不要丢弃注释,配合 `-E‘ 选项使用。 |
-P |
告诉预处理器不要产生 `#line‘ 命令,配合 `-E‘ 选项使用 |
-v |
(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号. |
-pipe |
在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的 汇编器不能从管道读取数据. GNU的汇编器没有这个问题. |
-ldl |
表示生成的对象模块需要用到共享库:$ gcc say.c -ldl -o say 主要是用到了 dlopen 等函数需要用到此选项 |
-I |
指定头文件路径 |
-e name |
指定 name 为程序的入口地址 |
-ffreestanding |
编译独立的程序,不会自动链接 C 运行库、启动文件等;他隐含声明了 `-fno-builtin‘ 选项,而且对main函数没有特别要求。 |
-finline-functions -fno-inline-funcitons |
启用内联函数 关闭内联函数 |
-g |
以操作系统的本地格式(stabs,COFF,XCOFF 或 DWARF)产生调试信息,GDB能够使用这些调试信息。 |
-ggdb |
以本地格式(如果支持)输出调试信息,尽可能包括GDB扩展。 |
-L <directory> |
指定链接时查找路径,多个路径之间用冒号隔开 |
-nostartfiles |
不链接系统标准启动文件,比如crtbegin.o、crtend.o,而标准库文件仍然正常使用。 |
-nostdlib |
不链接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。 |
-static |
在支持动态连接(dynamic linking)的系统上阻止连接共享库。即只能使用静态链接。 |
-shared |
生成一个共享目标文件,他可以和其他目标文件链接产生可执行文件。 |
-O |
优化。对于大函数,优化编译占用稍微多的时间和相当大的内存。 不使用 `-O‘ 选项时,编译器的目标是减少编译的开销,使编译结果能够调试。 语句是独立的:如果在两条语句之间用断点中止程序,可以对任何变量重新赋值,或者在函数体内把程序计数器指到其他语句,以及从源程序中精确地获取你期待的结果。 不使用 `-O‘ 选项时,只有声明了register的变量才分配使用寄存器。编译结果比不用 `-O‘ 选项的GCC要略逊一筹. 使用了 `-O‘ 选项,编译器会试图减少目标码的大小和执行时间。 如果指定了`-O‘选项,,`-fthread-jumps‘ 和 `-fdefer-pop‘ 选项将被打开。 |
-O2 |
多优化一些。 除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作。例如不进行循环展开(loop unrolling)和函数内嵌(inlining)。 和 -O 选项比较,这个选项既增加了编译时间,也提高了生成代码的运行效果。 |
-O3 |
优化的更多。除了打开 -O2所做的一切,它还打开了-finline-functions选项。 |
-O0 |
不优化。如果指定了多个 -O选项,不管带不带数字,最后一个选项才是生效的选项。 |
-Wall |
对源代码中的多数编译警告进行启用 |
-fpic |
如果支持这种目标机,编译器就生成位置无关目标码。适用于共享库(shared library)。 |
-fPIC |
如果支持这种目标机,编译器就输出位置无关目标码。适用于动态连接(dynamic linking),即使分支需要大范围转移。 |
-fPIE |
使用地址无关代码模式编译可执行文件 |
-Xlinker option |
把选项option传递给连接器,可以用他传递系统特定的连接选项, GNU CC无法识别这些选项。 如果需要传递携带参数的选项,必须使用两次 `-Xlinker‘,一次传递选项,另一次传递他的参数。 例如,如果传递 `-assert definitions‘,必须写成 `-Xlinker -assert -Xlinker definitions‘,而不能写成 `-Xlinker "-assert definitions"‘,因为这样会把整个字符串当做一个参数传递,显然这不是连接器期待的。 |
-Wl option |
把选项option传递给连接器。如果option中含有逗号,就在逗号处分割成多个选项。 |
-fomit-frame-pointer |
禁止使用 EBP 作为函数帧指针 |
-fno-builtin |
禁止 GCC 编译器内置函数 |
-ffunction-sections |
将每个函数编译到独立的代码段 |
-fdata-sections |
将全局/静态变量编译到独立的数据段 |
GCC编译器原理(一)------交叉编译器制作和GCC组件及命令
标签:ecif roo 令行 ued ros 图片 上进 set static
原文地址:https://www.cnblogs.com/kele-dad/p/9393500.html