文章目录交叉编译 strace1 概述2 源码下载2.1 官网下载2.2 使用 apt source 下载3 交叉编译3.1 编译步骤3.2 多架构支持3.3 移除符号表与调试信息交叉编译 strace1 概述strace是 Linux 环境下的一款程序调试工具用于监控一个应用程序所使用的系统调用以及它所接收到的系统信息。1系统管理员、诊断人员和故障排除人员会发现它对于解决源代码不易获得的程序问题非常宝贵因为它们不需要重新编译程序来跟踪它们。strace的操作是由称为ptrace的内核特性实现的。2官方网址https://strace.io2 源码下载2.1 官网下载strace的官方仓库是 Github 与 Gitlab。你可以从以上两个仓库克隆源码下来或者按照官方指引从 Fedora rawhide, OBS, Sisyphus 获取最新的二进制软件包。官方最新的源码 tar 包可以从 https://strace.io/files/ 网址获取。以 6.10 版本为例可以从这里获取得到。使用wget从命令行下载wgethttps://strace.io/files/6.10/strace-6.10.tar.xz以量产发布为目的的建议采用以上方式下载特定的软件版本。如果是希望参与到strace的开发或者维护使用git clone下载可以查看版本的所有修改记录。gitclone https://github.com/strace/strace.git2.2 使用 apt source 下载如果你使用的是 Ubuntu/Debian 系统可以使用apt source指令进行源码下载。aptsourcestrace此处下载的是与 Ubuntu/Debian 系统版本相符的 strace 源码并非最新源码。3 交叉编译3.1 编译步骤解压缩源码包如果使用git clone下载回来的源码可以忽略这一步。tar-xvfstrace-6.10.tar.xz解压缩源码包之后建议先阅读 README 与 INSTALL 文档里面有关于编译的相关信息。strace 支持的是 GNU Build System 编译系统简单理解就是 Unix 经典编译三部曲./configure,make,make install。在进行交叉编译前首先创建一个环境配置文件aarch64-environment-setup配置最重要的交叉编译环境变量aarch64-environment-setup:exportTOOLCHAIN_ROOT/opt/toolchains/aarch64--glibc--stable-2022.03-1exportBUILDSYSROOT$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysrootexportPATH$TOOLCHAIN_ROOT/bin:$PATHexportPREFIX/usrexportCCaarch64-linux-gcc --sysroot$BUILDSYSROOTexportCXXaarch64-linux-g --sysroot$BUILDSYSROOTexportCPPaarch64-linux-gcc -E --sysroot$BUILDSYSROOTexportLDaarch64-linux-ld --sysroot$BUILDSYSROOTexportARaarch64-linux-arexportASaarch64-linux-asexportNMaarch64-linux-nmexportGDBaarch64-linux-gdbexportOBJDUMPaarch64-linux-objdumpexportOBJCOPYaarch64-linux-objcopyexportRANLIBaarch64-linux-ranlibexportREADELFaarch64-linux-readelfexportSTRIPaarch64-linux-stripexportCONFIGURE_FLAGS--hostaarch64-linux --buildx86_64-linuxexportPKG_CONFIG_SYSROOT_DIR$BUILDSYSROOTexportPKG_CONFIG_PATH$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig在本示例中交叉编译工具位于/opt/toolchains/aarch64--glibc--stable-2022.03-1/bin目录下将该目录配置到PATH环境变量让系统能够正确搜索到。同时在配置CCCXXCPP与LD环境变量时指定--sysrootdir参数让交叉编译器搜索dir目录下的头文件与库文件而不是/usr/include及/usr/lib。sourceaarch64-environment-setup ./configure --enable-mperscheck--prefix/usr$CONFIGURE_FLAGSmakemakeDESTDIR$BUILDSYSROOTinstall-strip源码包解压后使用cd命令切换到源码路径在源码目录下创建环境设置文件并调用source命令让环境变量生效执行源码包的configure文件带上--prefix参数指定安装路径。在配置文件中定义了临时的CONFIGURE_FLAGS来指定--host与--build选项的值具体的说明可以使用./configure --help命令进行查阅执行make命令编译源码使用DESTDIR参数作为安装目标文件的前缀变量后面带上你希望安装到的文件夹路径详细介绍可以参考 DESTDIR 官方介绍。或者参考我的博文「交叉编译 gmp」关于 DESTDIR 的用法说明。最终你就可以在环境变量定义的$BUILDSYSROOT目录中找到交叉编译好的 gdb 的可执行文件、头文件及库文件。你可以指定DESTDIR/tmp/fakeroot则整个strace的产物会统一放在/tmp/fakeroot目录下方便部署验证。makeDESTDIR/tmp/fakeroot install-strip3.2 多架构支持在上面的编译指令中有一个重要的参数--enable-mperscheck如果没有配置该参数在编译过程中会出现如下报错信息checkingforgnu/stubs-32.h... no configure: Created empty gnu/stubs-32.h checkingform32 personality compile support(using -I./bundled/linux/arch/arm64/include/uapi -I./bundled/linux/include/uapi-Isrc)... no checking whether toenablem32 personality support... no configure: error: Cannotenablem32 personality support原因是strace的一个编译特性在 INSTALL 文件 1.2.1 章节有详细说明原文中mpers指的是Multiple personalities support直译为多个性支持文件中描述「个性是执行系统调用的一种方式」。根据上下文的组合我对其的理解是此处的personality指的是 CPU 架构意思是在 64 位 CPU 架构上如果编译器支持的话可以增加对 32 位架构的支持。--enable-mpers的默认参数为yes不过由于我所用的aarch64-linux-gcc并不支持 AArch32 架构所以只能使用check来让configure对编译器特性进行评估。以下是 INSTALL 中关于 Multiple personalities support 的说明可大致了解一下该编译特性。3.3 移除符号表与调试信息strip删除或修改附加到汇编器和链接编辑器输出的符号表这有助于在程序调试后节省空间并限制动态绑定的符号。3由于strip会删除文件中的调试信息因此通常用于发布 Release 版本的软件。4在上面部署命令使用的是make install-strip它会执行Makefile文件中定义的install-strip目标动作install-strip: if test -z $(STRIP); then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM$(INSTALL_STRIP_PROGRAM) \ install_sh_PROGRAM$(INSTALL_STRIP_PROGRAM) INSTALL_STRIP_FLAG-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM$(INSTALL_STRIP_PROGRAM) \ install_sh_PROGRAM$(INSTALL_STRIP_PROGRAM) INSTALL_STRIP_FLAG-s \ INSTALL_PROGRAM_ENVSTRIPPROG$(STRIP) install; \ fi在动作语句中会判断STRIP环境变量是否为空如果不为空则使用$(STRIP)作为STRIPPROG(strip program)。我们在aarch64-environment-setup定义了export STRIPaarch64-linux-strip因此Makefile使用的是我们定义好的aarch64-linux-strip工具来删除编译产物的符号表与调试信息。可以使用make install与make install-strip对比生成的二进制文件信息与文件大小。使用filestrace可以列出详细的文件信息未 strip 的编译产物文件大小为6.8M带有调试信息并明确显示with debug_info, not stripped.strace: ELF64-bit LSB executable, ARM aarch64, version1(SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1,forGNU/Linux4.9.0, with debug_info, not stripped进行了 strip 的编译产物文件大小为1.2M显示为stripped.strace: ELF64-bit LSB executable, ARM aarch64, version1(SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1,forGNU/Linux4.9.0, stripped这就是 strip 的作用与差别一般用于正式发布Release的软件都需要进行strip以消除调试信息以及缩减文件大小。strace 程序调试工具 ↩︎https://strace.io ↩︎man strip ↩︎【cmake】make install/strip减小目标占用的空间大小 ↩︎