编译过程

编译流程
1预编译-GCC中提供的预编译器为cpp
2编译-调用编译器cc1; gcc产生汇编代码在/tmp ccYBInzt.s
3汇编-调用汇编器as;汇编编译产生汇编文件保存在目录/tmp cca2nBio.s;产生的目标文件保存在目录/tmp ccj54pkM.o
4链接 gcc调用collect2辅助程序链接-最终调用链接器ld完成链接;

ld链接器:链接目标文件.o;链接libc,libgcc等库;启动代码的启动文件:crt1.o,crti.o,crtbegin.o,crtend.o,crtn.o

 构建目标系统的工具链运行在IA32体系架构上的,同宿主系统,但不能使用宿主系统的工具链(防止依赖-EG:

在编译程序中使用了宿主系统的链接器,链接器寻找动态库可能需要链接到宿主系统的某些库

);


GNU工具链由3个软件包+内核头文件组成:

Binutils,GCC,Glibc;

Binutils(Binary utilities)-二进制相关文件的工具,包括生成目标文件的汇编器(as),链接器(ld),处理二进制文件的工具objdump,strip等,但也有不是处理二进制文件的工具,类似处理文本文件的预编器cpp;

GCC:各种编译器-C,C++,Fortran,Ada编译器(根据情况选择构建的编译器)

Glibc:包括C库,动态链接器(linker);C的启动文件;其他的C库有:EGlibc,uClibc;没有操作系统的系统(freestanding environment),可以选择newlib,dietlibc,或者不需要用到C库;(C库的很大一部分函数都是对内核服务的封装--构建C库之前需要在工具链中安装内核头,相当于内核和C库之间的桥梁);

要构造工具链,需要理清软件包之间的联系;

GCC和Glibc的循环依赖问题

  • C编译器执行依赖C库的头文件来满足一些特性;
  • C++的库和编译器需要C库支持,such as 异常处理部分,栈回溯;
  • C编译器调用C库一些函数;

(freestanding解决办法:GCC提前进行编译,再加上C库,减少依赖,构建可以分先后执行)

 

构建工具链的过程

  • MODE 1 利用宿主系统构建独立的本地编译工具链;

 

  • MODE 2 构建一套交叉编译工具链(嵌入式);

步骤:构建交叉Binutils->构建临时交叉编译器(仅支持freestanding environment)->安装目标系统的内核头文件->构建目标系统的C库->构建完整的交叉编译器(支持hosted和freestanding);

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值