交叉编译 attr
概述
attr – extended attributes on filesystem objects, 扩展文件系统对象的属性。
扩展属性实现了用户将 name:value(名称:值)对附加到文件系统中的对象的能力。
本文档描述了 attr 命令,它与同名的 IRIX 命令基本兼容。它最初专门针对 XFS 文件系统的用户,尽管它现在可以在任何支持扩展属性的文件系统上使用,但对于与文件系统无关的扩展属性操作的通用和更可移植的接口,请参阅 getfattr 和 setfattr 文档。
扩展属性可用于存储文件的元信息。例如,“character-set=kanji” 可以告诉文档浏览器在显示时使用汉字字符集,而 “thumbnail=…” 可以提供高分辨率图形图像的低分辨率概览。
在受支持的文件系统中,名称的长度最多为 256 字节,以第一个 0 字节结尾。其目的是它们是属性为可打印 ASCII(或其他字符集)的名称,这些值最多可以是 64KB 的任意二进制数据。
属性可以附加到所有类型的 inode:常规文件、目录、符号链接、设备节点等。
扩展属性使用与每个文件系统对象关联的两个不相交的属性名称空间。它们是根和用户地址空间。根地址空间只能由超级用户访问,并且只能通过为函数调用指定标志参数来访问。其他用户将无法看到或修改根地址空间中的属性。用户地址空间受正常文件权限机制保护,因此文件所有者可以决定谁能够查看和/或修改任何特定文件的属性值。
可以从 http://savannah.nongnu.org/projects/attr 获取 attr 源码。
同时 attr 也提供了 git 仓库进行代码管理与开发。
下载
开发版本 (最新)
如果以研究学习为目的,或者希望尝试最新特性,又或者希望参与到 attr 的开发中,可以直接从 git 上拉取最新源码,拉取命令:
git clone https://git.savannah.nongnu.org/git/attr.git
发行版本
如果以商用量产为目的,一般选择正式的发行版本为佳。在 attr 的 Download 页面,源码以压缩包的形式提供,根据需求选择合适的版本进行下载,以 2.5.1 版本为例,下载源码包 attr-2.5.1.tar.gz.
也可以直接使用 wget
命令下载:
wget http://download.savannah.nongnu.org/releases/attr/attr-2.5.1.tar.gz
交叉编译
解压缩源码包,如果使用 git clone
拉回来的代码可以忽略这一步
tar -xvf attr-2.5.1.tar.gz
解压缩源码包之后可以先阅读 README 文档,从源码包的文件结构来看,attr 使用的是 ./configure
, make
, make install
的编译方法,经典的 UNIX 软件部署模式。
首先创建一个环境配置文件 aarch64-environment-setup
,配置最重要的交叉编译环境变量。
aarch64-environment-setup:
export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATH
export PREFIX=/usr
export CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-strip
export CONFIGURE_FLAGS="--target=aarch64-linux --host=aarch64-linux --build=x86_64-linux --with-sysroot=$BUILDSYSROOT"
export PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig
在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin
目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CC,CXX,CPP 与 LD 环境变量时指定 --sysroot=<dir>
参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include
及 /usr/lib
。
source aarch64-environment-setup
./configure --prefix=/usr $CONFIGURE_FLAGS
make
make DESTDIR=$BUILDSYSROOT install-strip
- 在源码目录下创建环境设置文件并调用
source
命令让环境变量生效 - 执行源码包的
configure
文件,带上--prefix
参数,指定安装路径。在配置文件中定义了临时的 CONFIGURE_FLAGS 来指定--host
与--build
选项的值,具体的说明可以使用./configure --help
命令进行查阅 - 执行
make
命令编译源码 - 使用 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,在本示例中,BUILDSYSROOT 指的是交叉编译工具链的 sysroot 目录,此环境变量在
aarch64-environment-setup
中已定义。更详细介绍可以参考 DESTDIR 官方介绍,也可以参考我的博文《交叉编译 libcap》关于 DESTDIR 的用法说明。
最终你就可以在 $BUILDSYSROOT/usr
文件夹中找到交叉编译好的 attr 的头文件及库文件。Good luck.
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景
△ \triangle △ 交叉编译 MQTT/Mosquitto