当前位置:首页 > 芯闻号 > 充电吧
[导读]本文是对《深度探索linux操作系统系统构建和原理解析》的笔记,目的是为了理解操作系统,重点放在了各种依赖关系上,没有刻意去记录细节。1.疑惑构建目标系统的时候,即使目标系统和宿主系统运行在同一个体系

本文是对《深度探索linux操作系统系统构建和原理解析》的笔记,目的是为了理解操作系统,重点放在了各种依赖关系上,没有刻意去记录细节。


1.疑惑构建目标系统的时候,即使目标系统和宿主系统运行在同一个体系架构上,为什么也不能使用宿主系统的工具链?

编译程序时,如果使用了宿主系统的链接器,链接器将在宿主系统的文件系统中找依赖的动态库,会导致目标系统的程序链接宿主系统的某些库,导致目标系统依赖宿主系统。

直观表现为程序编译顺利通过,在目标系统运行的时候,出现未定义符号错误。 目标系统使用的工具链的版本通常不同于宿主系统,这也要求为目标系统构建一套新的工具链。

2.构建工具链的意义和目的

工具链在开发中占据位置非常重要,实际中经常用到的是别人构建好的工具链,别人的普遍使用保证了正确性,缺点是没有针对具体的硬件平台优化,有时候也要借助某些辅助工

只对特定硬件进行配置优化,半自动为系统构建编译工具链。对我来说也就是为了了解操作系统。


3.工具链组成:

Binutils:包含所有二进制相关的工具,as,ld,objdump,strip还有预处理器cpp

GCC:各种编译器C,C++,Fortan,C++启动文件

Glibc:C库,动态连接器。C的启动文件。

内核头文件,C库的大多数函数是对内核服务的封装,C库的很大一部分函数是对内核服务的封装,内核头文件是C库和内核的桥梁。


4.构建步骤工具链的步骤

1.构建交叉的Binutils,包括汇编器as,链接器ld等

2.构建临时的交叉编译器仅仅支持freestanding

3.安装目标内核头文件

4.构建目标系统的C库

5.构建完整的交叉编译器。

步骤确定的原因:GNU把编译器和C库放在了两个不同的软件包里面,使得工具链可选择不同的C库,但是带来了编译器和C库的循环依赖问题,编译C库需要编译器,编译器

也依赖C库,但是C99针对运行在操作系统上的程序和运行在没有操作系统上的程序提供了两种实现方式,分别是hosted implementation和freestanding implementation,后

者不依赖C库,解决了鸡和蛋的问题,但是Binutils 什么也不依赖,所以先构建它。


5.编译器为什么会依赖C库,不是翻译为汇编语言吗?

C编译器需要知道C库的某些特性,来决定支持那些特性。C++库和编译器需要C库的支持,如异常处理部分和栈回溯部分。GCC不仅包含编译器还包含一些库,这些库通常依

赖C库,C编译器本身也会使用C库的一些函数。

6.编译目标的C库安装了什么?


C库

Glibc除了将最基本、最常用的函数封装在libc中外,又将功能相近的一些函数封装到一些子库里,比如将线程相关函数封装在libpthread中,将与加密算法相关的函数封装在

libcrypt中,等等。

Glibc除了安装库文件本身外,还建立了符号链接,动态链接时使用的共享库符号链接。其命名格式一般为:libLIBRARY_NAME.  so.MAJOR_REVISION_VERSION


比如数学库的共享库及其符号链接如下:
vita@baisheng:/vita/sysroot/lib$ ls -l libm*
-rwxr-xr-x 1 vita vita 792815 Jan 23 10:29 libm-2.15.so
lrwxrwxrwx 1 vita vita 12 Jan 23 10:29 libm.so.6 -> libm-2.15.so
-rwxr-xr-x 1 vita vita 42195 Jan 23 10:29 libmemusage.so
lrwxrwxrwx 1 vita vita 17 Jan 29 17:17 libmount.so.1 ->
libmount.so.1.1.0
-rwxr-xr-x 1 vita vita 746758 Jan 29 17:17 libmount.so.1.1.0

其中,libm-2.15.so是数学库的共享库本身,libm.so.6是运行时使用的符号链接,libm.so
是编译链接时使用的符号链接

动态链接器
Glibc亦提供了加载共享库的工具——动态加载器

头文件
Glibc为应用程序的开发提供了头文件,安装在$SYSROOT/usr/include目录下。

工具
Glibc也提供了一些可执行的便利工具,这类工具一般安装在sbin、usr/bin、usr/sbin目录下,比如用来转换文件字符编码的工具iconv。

启动文件

Glibc提供了启动文件,包括crt1.o、crti.o、crtn.o等,这类文件在编译链接时将被链接,器链接到最后的可执行文件中,Glibc将其安装在$SYSROOT/usr/lib目录下。

7.最终的交叉编译器安装的主要文件如下:


驱动程序
GCC安装的最主要的是交叉编译器的驱动程序,包括i686-none-linux-gnu-gcc、i686-none-linux-gnu-g++等。

目标系统的库和头文件,GCC中也包含了一些用于目标系统的运行时库及头文件,它们安装在$CROSS_TOOL/,i686-none-linux-gnu目录下。在该目录下,子目录lib存放包括目标系统的运行时库以及供目标系统编译程序使用的静态库,子目录include下包含开发目标系统上的程序需要的C++头文件。

helper program
前面我们提到,gcc仅仅是一个驱动程序,它将调用具体的程序完成具体的任务,这些
程序被GCC安装在libexec目录下,典型的有编译器cc1,链接过程调用的collect2等

freestanding实现文件

启动文件
与C++相关的启动文件在GCC中,包括crtbegin.o、crtend.o等



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

使用环境Ubuntu 12.042,VMware Workstation3,微集成7英寸4418 Linux平板电脑安装用于gcc-linaro-arm的交叉工具包。该程序包位于虚拟机的适当目录中,该目录在以下目录中进行...

关键字: Linux 交叉编译 工业平板

源码下载官网: https://w1.fi/releases/ libnl-1.1.4交叉编译: ./configure CC=xx-gcc \ --prefix=/home/xx/openspur

关键字: 交叉编译 源码

一、什么是交叉编译       在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台

关键字: 交叉编译

先来简单谈谈生成一个可执行文件所需要的过程 预处理(preprocessing)->编译(compilation)->汇编(assembly)->连接(linking) 编译:.c-

关键字: makefile 交叉编译

具体内容:  首先需要安装macports安装完成后我们使用命令:callondeMacBook-Pro:~ callon$ sudo port install libelf Password: Er

关键字: macbook 交叉编译

1> 解压下载的交叉工具链2> vi /etc/profile在这个文件最后添加上自己的环境变量:export PATH=$PATH:/usr/local/arm/4.3.2/bin($PATH后面为解压的交...

关键字: ARM 交叉编译 环境配置

关于ARM交叉编译工具链的介绍与下载请点我跳转 一、简介:简单介绍一下:交叉编译器一般来说是针对某个特定版本的uboot和kernel来专门制作的,也就是说,如果一个开发板的uboot和内核版本确定

关键字: ARM 交叉编译

编译器:就是将"一种语言(通常为高级语言)"翻译为"另一种语言(通常为低级语言)"的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor)

关键字: 交叉编译

在工作目录下建立helloworld.c文件#includemain(){printf("helloworld!\\n");}保存关闭后。编译helloworld文件:root@snail:/home...

关键字: 交叉编译 tiny6410

ACE应用于主站数据采集核心的开发已告一段落了。现在打算涉足嵌入式linux应用程序的设计。俗话说“工欲善其事,必先利其器”,ACE支持arm系列的嵌入式系统,当然首先折腾他了,后期还打算整整apache的运行时库apr...

关键字: ace arm-linux 交叉编译
关闭
关闭