《手把手教你构建自己的 Linux 系统》学习笔记(4)

汇编链接器(Binutils)

这是一个软件包,这个软件包其实是一个工具集,里面含有了大量的用于汇编程序活着读取二进制文件相关的程序。

CC

它是一条命令的别名,这条命令的作用是使用 GCC 的 C 语言编译器。

CXX

它是一条命令的别名,用于指定 GCC 的 C++ 编译器。

CFLAGS

用于设置编译 C 程序时传递给编译器的参数。

CXXFLAGS

用于设置编译 C++ 程序的时候传递给编译器的参数。

LDFLAGS

用于设置在链接过程中使用的参数。

如何让 make 命令定向处理指定的目录

使用 make 命令的 -C 参数可以达到这个目的。

-C 参数后面接的目录,是 make 命令处理的对象目录。

make 命令如何使用传递参数的功能?

你可以直接在 make 后面接上你想要使用的参数的键值对,如果以后的编译过程中使用了这个键值对,那么就会直接利用你设定好的参数来进行编译。

例如 

	make -C ld LIB_PATH=/tools/lib

这条命令的作用是让 make 对 ld 这个目录进行编译,然后如果遇到了 LIB_PATH 这个参数,就直接使用你设置好的值。

GCC 里的编译参数 --disable-nls 是什么意思?

这个命令后面的 nls 的全称是 national language support 的简写,所以他的意思是让 make 不要编译那么多的语言文件,从而使得编译的时间缩短,编译后的文件也会变得更加小。

GCC 的编译过程是怎样的?

首先是系统的 C 语言,编译 GCC 源代码的 C 语言,然后编译 GCC 源代码里的其他语言。

为何会有 GCC Bootstrap 编译方式?

GCC Bootstrap 这种编译方式的产生是处于安全考虑的。

毕竟你如果使用 GCC 来编译你的源代码,如果你的 GCC 编译器出现问题了,那么你编译出来的代码肯定有问题。

所以你需要保证你的 GCC 编译器必须是正确的。

而 GCC Bootstap 这种编译方式又称为「自编译方式」一定程度上是由于他的编译过程比较奇葩。

那么 Bootstrap 编译过程是什么?

首先会使用 GCC 编译 GCC 源代码来产生一个 C 语言编译器。

然后由上一步产生 C 语言编译器,再次编译 GCC 源代码来产生多第二个 C 语言编译器。

然后将这两个 C 语言编译器进行比较,如果相同,就说明这个 GCC 编译器是没有问题的。

然后就由第二个 C 语言编译器来编译其他的代码。

因为他两次编译出来的 C 语言编译器,都是以同一个 GCC 源代码进行编译的,所以这个编译过过程又叫做「自编译」,就是自己编译自己嘛。

如何开启 Bootstrap 编译,又如何关闭?

需要注意的是,早期的 GCC 版本,默认是不进行 Bootstrap 方式进行编译的,需要在编译过程中指定使用该方式,使用 「make bootstrap」来进行编译。

然后 4.3 以上版本默认在本地方式的编译中就开启了该方式,无论使用 make 还是使用 make bootstrap 都是使用 bootstrap 方式来进行编译的,关闭的方法就是在 配置 GCC 的过程中加入「--disable-bootstarp」参数。

Glibc 的作用是什么?

Glibc 是一个 C 库,它里面的库函数的作用就是保证程序可以调用内核的功能。

通过它很多程序可以不经过修改就可以直接移植到 Linux 上,而我们需要做的仅仅是重新编译这个程序。

它也可以运行在一些非 Linux 的内核上,比如 Hurd

GCC 的选项 march 和 mtune 的作用是啥?

march 和 mtune 用于告诉 GCC 编译器如何优化程序。

march 是用于设置应该按照什么架构来进行编译,使得编译出来的程序只要附和这个架构就能够运行。

mtune 是用于设置应该按照什么 CPU 来进行优化编译,如果不设置 mtune 就会自动是使用 march 的设置。

你也可以根据 native 来让 march 和 mtune 自动检测当前的环境来进行优化编译。

比如说,GCC -march=1686 -mtune=pentium4

就是让编译出来的程序能够在符合 1686 架构的平台上运行,同时针对奔腾4 的 CPU 进行优化。
posted @ 2015-08-14 14:15  0x1D  阅读(1508)  评论(0编辑  收藏  举报