《手把手教你构建自己的 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 进行优化。
《手把手教你构建自己的 Linux 系统》学习笔记(4)的更多相关文章
- 《手把手教你构建自己的 Linux 系统》学习笔记(10)
目录 /etc/fstab 文件的作用是什么? Linux 内核的图形化启动是怎么回事? Linux 系统中的文件名是否以大小写来进行区别? 「GRUB 中无法找到硬盘」怎么解决? 「GRUB 及配置 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(9)
目录 autoreconf 命令的作用是什么? aclocal automake -a autoconf 一条命令搞完三面三步 既然有其他的「编译控制软件」为何还是使用 make 来进行编译控制? M ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(8)
目录 Binutils 软件包有什么用? make -k 的作用是什么? man-pages 里有几种文档?分别表示什么意思? 如何查询指定目录的 man-pages ? 如何使用 make 命令的同 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(6)
目录 /dev 目录是干什么的? /proc 和 /sys 目录是干什么的? udev 这个软件是干什么用的? 目录映射是临时性的,还是永久性的? 命令行里大括号 "{}" 的作用 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(5)
交叉编译是什么? 交叉编译就是在一个系统上,编译生成另外一个系统运行的程序文件. 「硬件体系结构」和「操作系统」的关系是什么? 硬件体系结构也可以称为架构,主要是通过 CPU 的指令集来进行区分的,操 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(2)
Linux 系统定制原理 虚拟根目录 我们的目标是为了完成目标系统(也就是我们要做的系统),他是一个可以独立运行的系统,不依赖雨主系统和临时系统,根据 Linux 系统的特点它需要存放在根目录下面,但 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(1)
第二章.基础准备--Linux 系统定制原理 Linux 系统的组成及架构 共享库和静态库 在 Linux 系统中,函数库包含两种形式:共享库和静态库. 共享库 共享库在程序运行时,为其提供所需要的函 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(7)
目录 tee 命令的缺陷是什么?如何解决这个缺陷? /etc/ld.so.conf 文件的作用是什么? 动态链接和静态链接有什么不同? 动态编译 静态编译 共享库为什么会有版本?共享库的版本升级原理是 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(3)
需要注意的是,制作操作系统权限全程都要用 root pushd 和 popd 为了方便目录管理,所以出现了这种两个命令,他们的原理就是利用堆栈来实现目录管理. 这两个命令,pushd 负责将指定的目录 ...
随机推荐
- Vmware上安装Linux(centos7)图文教程
Vmware上安装Linux(centos7)图文教程 一.准备安装文件(vmware && centos7 镜像) 1.下载 vmware workstations :链接: ...
- windows丢失文件的恢复技巧
这几天在使用STVD调试程序的时候,突然跳出来一个“共享冲突”错误,当时并没有在意,点确定后赶紧CTRL+S,然后就一直死在那里了... 结束任务,重启STVD,提示找不到main.c,到此也不以为然 ...
- zabbix3.4搭建钉钉报警
1.在钉钉群里添加一个自定义的机器 在设置说明中无需开启Outgoing机制 红色箭头指的信息很重要后面脚本会用到 2.脚本 #!/usr/bin/python # -*- coding: utf-8 ...
- 从O365中获取users到D365中 使用flow
在我上篇blog中讲解到了怎么用代码把O365 users 获取到D365中. 从O365中获取users到D365中 这几天一直在研究flow, 发现flow可以更简单的完成这个功能. 一开始没有考 ...
- 找不到文件异常java.io.IOException: Resource [classpath:shiro.ini] could not be found.
情景 tomcat启东时,老是报错,在classpath下找不到配置文件,但是配置文件已经放在resource目录下了 解决方案 出现该异常的原因,是因为新建的conf文件夹,识别不了,因为没有设置成 ...
- JSP&Servlet学习笔记----第4章
HTTP是基于请求/响应的无状态的通信协议. 使服务器记得此次请求与之后请求关系的方式,叫做会话管理. 隐藏域:由浏览器在每次请求时主动告知服务器多次请求间必要的信息.仅适用于一些简单的状态 管理,如 ...
- CInternetSession的简单使用
1. CInternetSession的简单使用 CInternetSession session; CHttpFile *file = NULL; CString strURL = " h ...
- JVM垃圾回收机制和常用算法
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...
- C2440 “初始化”: 无法从“std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>”转换为“std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>”
错误原因vs已经提醒的很清楚了:无法将const_iterator转换为iterator 我的出错代码是这样的 思考了很久,最后发现原来是因为将函数定义为const的缘故. 总结:当将函数定义为con ...
- 【算法】混合流体模拟demo
展示一个流体模拟算法的实现 地址:http://www.iqiyi.com/w_19rzs1anol.html 采用C++编写,Blender渲染. 截图 参考文献 REN, B., LI, C., ...