前言
由于打算交叉编译 python,但是依赖 libffi 库,也就是 libffi 库也需要交叉编译
环境: ubuntu 20.04
交叉编译工具链:这里使用 musl libc 的 gcc 交叉编译工具链,
aarch64-linux-musleabi-gcc
,gcc 版本gcc version 12.2.0
下载 libffi 库
这里直接通过 github 下载当前最新的 libffi 库
git clone https://github.com/libffi/libffi.git
下载后,进入 libffi,默认源码中没有
configure
脚本,可以直接运行 libffi 源码中的autogen.sh
脚本,自动生成configure
配置脚本另外创建一个 libffi 库的 build 目录,可以放在 libffi 源码目录的外部,这样编译不会影响到 libffi 源码目录
这里在 libffi 目录外部创建一个新目录:
build_libffi
,然后进入build_libffi
,创建一个 编译 libffi 库的脚本build_aarch64.sh
注意设置的 交叉编译工具链路径,交叉编译工具链的各个工具
#!/bin/bashcross_tool_path=/home/zhangsz/smart/gnu_tools/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu/bin../libffi/configure \CC=${cross_tool_path}/aarch64-linux-musleabi-gcc \CXX=${cross_tool_path}/aarch64-linux-musleabi-g++ \AR=${cross_tool_path}/aarch64-linux-musleabi-ar \LD=${cross_tool_path}/aarch64-linux-musleabi-ld \READELF=${cross_tool_path}/aarch64-linux-musleabi-readelf \--prefix=$PWD/_build\--build=aarch64-linux-musleabi \--host=aarch64-linux \--target=aarch64-linux \--enable-shared \makemake install
设置执行 权限
chmod 777 build_aarch64.sh
执行脚本,开始配置与编译
编译报错问题
- 编译过程中,提示
linux/limits.h
找不到,由于我当前使用的是 非 Linux gcc 交叉编译工具链,也就是 musl libc 的 gcc 交叉编译工具链,因此找不到 Linux 的头文件,这里简单改一下,把linux/limits.h
改为limits.h
即可
../libffi/src/tramp.c:55:10: fatal error: linux/limits.h: No such file or directory
- 编译成功,生成了
libffi.so.8.1.2
库,ARM aarch64
平台
zhangsz@zhangsz:~/python/tools/build_libffi/_build/lib64$ ls -latotal 216drwxrwxr-x 2 zhangsz zhangsz 4096 1月23 22:56 .drwxrwxr-x 6 zhangsz zhangsz 4096 1月23 22:56 ..-rw-r--r-- 1 zhangsz zhangsz 104808 1月23 22:56 libffi.a-rwxr-xr-x 1 zhangsz zhangsz970 1月23 22:56 libffi.lalrwxrwxrwx 1 zhangsz zhangsz 15 1月23 22:56 libffi.so -> libffi.so.8.1.2lrwxrwxrwx 1 zhangsz zhangsz 15 1月23 22:56 libffi.so.8 -> libffi.so.8.1.2-rwxr-xr-x 1 zhangsz zhangsz 145000 1月23 22:56 libffi.so.8.1.2zhangsz@zhangsz:~/python/tools/build_libffi/_build/lib64$ file libffi.so.8.1.2libffi.so.8.1.2: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, with debug_info, not stripped
- libffi 最新 github 上的版本交叉编译成功,生成了 相应的库
小结
交叉编译 libffi 还是相对比较简单,如果 libffi 源码没有
configure
配置脚本,需要 autoconf 工具生成注意有的 gcc 交叉编译工具链没有 Linux 的头文件,这部分可以使用相应工具链中的头文件代替,比如
#include
改为#include