最近在编译gdb和交叉编译gdb的时候学习到的一些东西
0x01 configure、 make、 make install 背后的原理
1 | ./configure |
接下来让我们深入 Unix 去搞清楚这几行命令的作用。
做了什么
整个过程分为三步:
- 配置
configure
脚本负责在你使用的系统上准备好软件的构建环境。确保接下来的构建和安装过程所需要的依赖准备好,并且搞清楚使用这些依赖需要的东西。
Unix 程序一般是用 C 语言写的,所以我们通常需要一个 C 编译器去构建它们。在这个例子中 configure
要做的就是确保系统中有 C 编译器,并确定它的名字和路径。
- 构建
当 configure
配置完毕后,可以使用 make
命令执行构建。这个过程会执行在 Makefile
文件中定义的一系列任务将软件源代码编译成可执行文件。
你下载的源码包一般没有一个最终的 Makefile
文件,一般是一个模版文件 Makefile.in
文件,然后 configure
根据系统的参数生成一个定制化的 Makefile
文件。
- 安装
现在软件已经被构建好并且可以执行,接下来要做的就是将可执行文件复制到最终的路径。make install
命令就是将可执行文件、第三方依赖包和文档复制到正确的路径。
这通常意味着,可执行文件被复制到某个 PATH
包含的路径,程序的调用文档被复制到某个 MANPATH
包含的路径,还有程序依赖的文件也会被存放在合适的路径。
因为安装这一步也是被定义在 Makefile
中,所以程序安装的路径可以通过 configure
命令的参数指定,或者 configure
通过系统参数决定。
如果要将可执行文件安装在系统路径,执行这步需要赋予相应的权限,一般是通过 sudo。
安装过程简单说就是 configure 脚本根据系统信息将 Makefile.in 模版文件转换为 Makefile文件
1.1 -build –host –target
源码经过编译生成可执行程序。根据执行编译操作的平台、可执行程序的运行平台、可执行的程序的处理平台,可以将编译操作分为多种类型,对应的三个配置参数如下:
- –build:运行编译工具链的平台,也就是正在执行编译操作的平台。如果未指定此参数,则通过 config.guess 猜测得到。通常都不指定此参数。
- -host:可执行程序将运行的平台。如果未指定此参数,则和 –build 相同
。如果 --host 和 --build 不同,是交叉编译;否则是普通编译。
- -target:
可执行程序将处理的平台。
如果未指定此参数,则和 –host 相同。一般来说,程序运行在什么平台,处理的就是什么平台,此参数值和 –host 参数相同,不需显式指定,所以通常不会关注到此参数。但在制作交叉编译工具 (如 gcc、gdb 等) 这种特殊情况下,此值和 –host 不同,例如交叉编译器 arm-linux-gcc,它运行在 x86-linux 平台 (–host 参数),但处理的是 arm-linux 平台 (–target 参数)。如果是交叉编译一个普通的应用,如运行于 arm-linux 平台的 tftp 程序,则它的运行平台和处理平台都是 arm-linux 平台。
1.2交叉编译gdb(mips 架构)
如果是交叉编译gdb,只设置host参数就可以了。target默认会和host参数相同。
1 | sudo ./configure --host=mipsel-openwrt-linux CC=mipsel-linux-gnu-gcc CXX=mipsel-linux-gnu-g++ CFLAGS=-static |
1.3 64位环境下编译32位gdb
需要依赖libdeflate库,因此先将libdflate库安装到指定文件夹下
1 | sudo make CFLAGS="-m32" |
然后编译gdb
- clean清除
- 消除掉原来的cache
- 重新设置config
- 在make时指定我们编译libdelate库的位置
1 | make clean |
1.4 正常编译64位gdb
1 | make clean |
1.5 查看交叉编译链适配环境
参考
The magic behind configure, make, make install (thoughtbot.com)
makefile介绍 — 跟我一起写Makefile 1.0 文档 (seisman.github.io)
BuildingCrossGDBandGDBserver - GDB Wiki (sourceware.org)
Ubuntu 建立 gdb cross-complier 開發環境 | YuYan’s blog (tsaiyuyan.github.io)