gdb交叉编译

最近在编译gdb和交叉编译gdb的时候学习到的一些东西

0x01 configure、 make、 make install 背后的原理

1
2
3
./configure
make
make install

接下来让我们深入 Unix 去搞清楚这几行命令的作用。

做了什么

整个过程分为三步:

  1. 配置

configure 脚本负责在你使用的系统上准备好软件的构建环境。确保接下来的构建和安装过程所需要的依赖准备好,并且搞清楚使用这些依赖需要的东西。

Unix 程序一般是用 C 语言写的,所以我们通常需要一个 C 编译器去构建它们。在这个例子中 configure 要做的就是确保系统中有 C 编译器,并确定它的名字和路径。

  1. 构建

configure 配置完毕后,可以使用 make 命令执行构建。这个过程会执行在 Makefile 文件中定义的一系列任务将软件源代码编译成可执行文件。

你下载的源码包一般没有一个最终的 Makefile 文件,一般是一个模版文件 Makefile.in 文件,然后 configure 根据系统的参数生成一个定制化的 Makefile 文件。

  1. 安装

现在软件已经被构建好并且可以执行,接下来要做的就是将可执行文件复制到最终的路径。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
2
sudo make CFLAGS="-m32"
sudo make install DESTDIR=/home/giantbranch/IOT/Tfuzz/test/i386 CFLAGS="-m32"

然后编译gdb

  • clean清除
  • 消除掉原来的cache
  • 重新设置config
  • 在make时指定我们编译libdelate库的位置
1
2
3
4
make clean
find . -name "*.cache" | xargs rm -rf
./configure --target=i386-linux CFLAGS="-static -m32"
make LDFLAGS+="-L /home/giantbranch/IOT/Tfuzz/test/i386/usr/local/lib"

1.4 正常编译64位gdb

1
2
3
4
make clean
find . -name "*.cache" | xargs rm -rf
./configure CFLAGS="-static"
make

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)

IoT安全研究视角的交叉编译 | Clang裁缝店 (xuanxuanblingbling.github.io)

-------------本文结束感谢您的阅读-------------
+ +