交叉编译 libcap

交叉编译 libcap

概述

由于交叉编译 systemd 依赖 libcap 库,所以需要先将 libcap 交叉编译出来,注意不是 libpcap,libpcap 是在 libcap 基础上开发的,systemd 使用的是 libcap。

libcap 属于 Linux 内核开发的一部分,源码托管在 git.kernel.org 网站。

git kernel
在网站的下方有着非常清晰的 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 官方说明。

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iBlackAngel

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值