编译iw工具
从源码编译 iw
交叉编译工具
- aarch64-linux-gnu-gcc
源码下载地址 (website)
libnl : https://www.infradead.org/~tgr/libnl/
iw : https://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git/
本文中所述的 根文件系统 指使用 busybox 制作的 qemu 虚拟机的根文件系统, 和物理机无关
从源码编译 libnl
- 
从官网下载源代码文件: 咕咕搜索 libnl即可找到官网 https://www.infradead.org/~tgr/libnl/ 之后下载最新版的源码即可wget https://www.infradead.org/~tgr/libnl/files/libnl-3.2.25.tar.gztar -xf libnl-3.2.25.tar.gz
- 
配置编译选项, 生成编译文件 可以在源代码的路径下找到 configure可执行文件, 这就和源码编译 qemu 类似了, 先使用--help查看一下支持的选项(base) yukikaze@LAPTOP-SQ5KB8RN:~/code/tools/libnl-3.2.25$ ./configure --help我能用到的就下面这些, 一个指示编译生成的结果的存放位置, 一个指示选择哪个编译器进行编译 - 
--prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] 
- 
--host=HOST cross-compile to build programs to run on HOST [BUILD] 
 因此在当前路径下新建一个目录 build用来存放编译结果, 配置编译文件的命令为, 该命令中要求必须是绝对文件路径./configure --prefix=/home/yukikaze/code/tools/libnl-3.2.25/build --host=aarch64-linux-gnu
- 
- 
编译, 移动编译结果, 查看 make在编译的过程中会报很多 warning , 不需要处理 make install # 会将编译结果移动至 `/home/yukikaze/code/tools/libnl-3.2.25/build/` 路径下移动过程基本不会出错 cd build ls etc include lib sbin share可以在 lib 路径下查看到动态运行库, 能看到这些动态运行库也是动态链接的, 连接到了 aarch64 的相关库中 (base) yukikaze@LAPTOP-SQ5KB8RN:~/code/tools/libnl-3.2.25/build/lib$ readelf -d libnl-3.so Dynamic section at offset 0x1dd98 contains 28 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x0000000000000001 (NEEDED) Shared library: [ld-linux-aarch64.so.1] 0x000000000000000e (SONAME) Library soname: [libnl-3.so.200] 0x000000000000000c (INIT) 0x7718 0x000000000000000d (FINI) 0x15094 0x0000000000000019 (INIT_ARRAY) 0x2ce30 0x000000000000001b (INIT_ARRAYSZ) 40 (bytes) 0x000000000000001a (FINI_ARRAY) 0x2ce58之后需要将 build/lib 路径下的所有文件复制到 根文件系统/lib 路径下, 作为 qemu 中运行的 iw 的动态链接库 
从源码编译 iw
前面的 libnl 是为这里编译 iw 提供一些库的支持。从 linux kernel 的源码仓库可以下载到最新的 iw 源码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git
无法使用静态链接库, 暂时使用默认的配置编译
# ... 前面有很多, 直接搜 CFLAGS 后添加即可 
CFLAGS += -static
添加环境变量, 该添加仅在当前bash中生效, 该环境变量指向刚刚编译的 libnl 结果中的 pkgconfig 路径
export PKG_CONFIG_PATH=/home/yukikaze/code/tools/libnl-3.2.25/build/lib/pkgconfig:$PKG_CONFIG_PATH
编译
make CC=aarch64-linux-gnu-gcc 
编译成功后结尾会有如下提示
(base) yukikaze@LAPTOP-SQ5KB8RN:~/code/tools/iw$ make CC=aarch64-linux-gnu-gcc 
 CC   iw
编译过程中可能会出现下述的编译错误: 该错误的原因是上面的 libnl 版本过低, 检查
implicit declaration of function ‘nla_put_s32’
该错误的原因是上面的 libnl 版本过低, 检查 libnl 编译结果文件 build/include/libnl3/netlink/attr.h 查看其中的枚举体中是否包含了 NLA_S32 数据类型
// attr.h
/**
 * @ingroup attr
 * Basic attribute data types
 *
 * See section @core_doc{core_attr_parse,Attribute Parsing} for more details.
 */
enum {
        NLA_UNSPEC,     /**< Unspecified type, binary data chunk */
        NLA_U8,         /**< 8 bit integer */
        NLA_U16,        /**< 16 bit integer */
        NLA_U32,        /**< 32 bit integer */
        NLA_U64,        /**< 64 bit integer */
        NLA_STRING,     /**< NUL terminated character string */
        NLA_FLAG,       /**< Flag */
        NLA_MSECS,      /**< Micro seconds (64bit) */
        NLA_NESTED,     /**< Nested attributes */
        NLA_NESTED_COMPAT,
        NLA_NUL_STRING,
        NLA_BINARY,
        NLA_S8,
        NLA_S16,
        NLA_S32,
        NLA_S64,
        /* Skip unimplemented attr types  */
        NLA_SINT = 20,
        NLA_UINT,
        __NLA_TYPE_MAX,
};
如果没有该数据类型,一般的原因是 libnl 版本过低,无法适配 iw 的代码, 可以选择去 libnl 的 GitHub 仓库拉取代码(https://github.com/thom311/libnl), 更新版本
查看编译结果 iw 文件, 可以看到其为动态链接的格式, 需要存在 /lib/ld-linux-aarch64.so.1 文件, 在使用的时候注意将动态链接文件移动至 busybox 制作的根目录文件系统的对应位置 (lib/ 路径下) 即可。
(base) yukikaze@LAPTOP-SQ5KB8RN:~/code/tools/iw$ file iw
iw: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=0809a0c2e944438ebdde170230733b6e501e3875, for GNU/Linux 3.7.0, with debug_info, not stripped
将 iw 文件复制到根文件系统的 bin/ 路径下即可在 qemu 中使用
~ # iw --version
iw version 6.9-12-ga0a7ddef29fc-dirty
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号