交叉编译 libcap
概述
由于交叉编译 systemd 依赖 libcap 库,所以需要先将 libcap 交叉编译出来,注意不是 libpcap,libpcap 是在 libcap 基础上开发的,systemd 使用的是 libcap。
libcap 属于 Linux 内核开发的一部分,源码托管在 git.kernel.org 网站。
在网站的下方有着非常清晰的 git clone 指引,你可以选择任意一个 git 地址进行克隆。
下载
开发版本 (最新)
如果以研究学习为目的,或者希望尝试最新特性,可以直接从 git.kernel.org 上拉取最新源码,拉取命令:
git clone https://git.kernel.org/pub/scm/libs/libcap/libcap.git
发行版本
如果以商用量产为目的,一般选择正式的发行版本为佳。在下载页面,源码以压缩包的形式提供,根据需求选择合适的版本进行下载,以最新的 2.67 版本为例,下载源码包 libcap-2.67.tar.xz。
也可以直接使用 wget
命令下载:
wget https://mirrors.edge.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.67.tar.xz
交叉编译
解压缩源码包,如果使用 git clone
拉回来的代码可以忽略这一步。
tar -xvf libcap-2.67.tar.xz
解压缩源码包之后建议先阅读 README 文档,里面有关于编译的相关信息。
从 README 文档以及解压后的文件布局可以发现,libcap 使用 Makefile
进行编译,而关于交叉编译最重要的配置信息在 Make.Rules
文件中定义,Make.Rules
第 69 行指定交叉编译器:
CC := $(CROSS_COMPILE)gcc
默认情况下,CROSS_COMPILE 环境变量为空值,普通编译时直接使用 CC := gcc
进行编译。当需要进行交叉编译时,需要配置 CROSS_COMPILE 以使用合适的编译器,假如交叉编译器为 aarch64-linux-gcc
,则配置 CROSS_COMPILE=aarch64-linux-
,组合后就是完整的交叉编译器名称 CC := aarch64-linux-gcc
。同时交叉编译器的路径必须在 PATH 环境变量中才能被正常调用。使用以下命令进行配置:
export PATH=$PATH:/work/toolchains/aarch64--glibc--stable-2022.03-1/bin
export CROSS_COMPILE=aarch64-linux-
除了 CROSS_COMPILE 外还需要配置 BUILD_CC 变量的值,该变量在 Make.Rules
第 89 行定义:
BUILD_CC ?= $(CC)
默认情况下 BUILD_CC 为编译器的名称,但在配置了交叉编译器之后,它将无法编译出在构建机器(Ubuntu)上正常运行的程序,编译过程中会报 _makenames
执行格式错误的问题:
/bin/sh: ./_makenames: cannot execute binary file: Exec format error
所以需要配置 BUILD_CC 依旧使用 gcc 命令来编译 _makenames 文件,可以参考以下的写法:
CROSS_COMPILE=aarch64-linux- BUILD_CC=gcc make
libcap 库文件编译完成之后,需要将编译产物统一放到指定路径以便打包发布,此时,DESTDIR 就可以派上用场了。
DESTDIR
是每个已安装目标文件的前缀变量。
DESTDIR
变量由用户在make
命令行上指定为绝对文件名。
make DESTDIR=/tmp/stage install
DESTDIR
应该只在install*
和uninstall*
目标中受支持,因为只有这些目标才有用。
如果您的安装步骤通常会安装/usr/local/bin/foo
和/usr/local/lib/libfoo.a
,那么在上面的示例中调用的安装将安装/tmp/state/usr/local/biin/foo
和/tmp/stage/usr/local/lib-libfoo.a
。以这种方式将变量
DESTDIR
前置到每个目标提供了分段安装,其中安装的文件不会直接放置到其预期位置,而是复制到临时位置(DESTDIR
)。但是,已安装的文件保持其相对目录结构,不会修改任何嵌入的文件名。
更详细说明可参考 DESTDIR 官方说明。
在 libcap 的交叉编译中,我们可以使用 make install DESTDIR=...
将编译产物安装到当前目录的 output
文件夹中,类似以下命令:
make install DESTDIR=$(pwd)/output
完整的编译命令:
export PATH=$PATH:/work/toolchains/aarch64--glibc--stable-2022.03-1/bin
CROSS_COMPILE=aarch64-linux- BUILD_CC=gcc make
mkdir output
make install DESTDIR=$(pwd)/output
最后,交叉编译产物会放置在 output
目录下,包含头文件与库文件。
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景
△ \triangle △ QNX 7.1 交叉编译 cron