Debian 平台交叉编译 SQLite
本文简要记录如何在 Debian 平台上交叉编译 SQLite 数据库。
准备⌗
在编译之前需要先安装基本的编译工具,本文我们将在 x86_64 平台下交叉编译 ARM64 程序,因此需要安装 ARM64 平台的 GCC 编译工具。您可以使用下面的命令进行安装:
sudo apt install gcc make gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
安装完成之后,使用下面的程序进行验证。
#include <stdio.h>
int
main(void)
{
printf("Hello world\n");
return 0;
}
我们将上面的内容保存在 hello.c
文件中,首先编译本地版本,即 x86_64
:
$ gcc -o hello-x86_64 hello.c
$ file hello-x86_64
hello-x86_64: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=8a0910c4b9f9808b7f8af9b26ed9e74a98e79c9b, for GNU/Linux 3.2.0, not stripped
我们可以执行该程序检查结果。
$ ./hello-x86_64
Hello world
接下来,我们使用该源码编译 ARM64 平台的程序。
$ aarch64-linux-gnu-gcc -o hello-arm -static hello.c
$ file hello-arm
hello-arm: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=4f2c9c391d2f5c97b8f0b1e66802f10bf108d5b4, for GNU/Linux 3.7.0, not stripped
如果我们在 x86_64 平台上执行 ARM64 版本的 hello-arm
程序,将得到预期的错误。
$ ./hello-arm
-bash: ./hello-arm: cannot execute binary file: Exec format error
我们在 SQLite 中引入了透明加解密功能,因此它依赖于 OpenSSL 库,在 x86_64 平台上通过 apt
可以很方便的安装。在交叉编译 ARM64 版本时,我们需要额外的步骤来安装 OpenSSL 依赖。
首先,我们需要在 x86_64 平台上安装 ARM64 版本的 OpenSSL 库,这样在链接的时候才不会出现找不到库的问题。
我们可以通过 dpkg --add-architecture <arch>
命令来添加不同的系统架构,例如,使用下面的命令添加:
$ sudo dpkg --add-architecture arm64
注意:上述修改仅在执行了 sudo apt update
之后才会生效。
dpkg 的系统架构保存在 /var/lib/dpkg/arch
文件中。
$ sudo cat /var/lib/dpkg/arch
amd64
arm64
你可以使用 dpkg --print-architecture
查看当前的系统架构,使用 dpkg --print-foreign-architectures
查看添加的其他系统架构,使用 dpkg --remove-architecture <arch>
移出系统架构。
接着,我们需要修改软件源 /etc/apt/sources.list
,使用下面的命令进行替换:
$ sudo sed -i.bak 's/deb http/deb [arch=amd64,arm64] http/' /etc/apt/sources.list
最后,不要忘记更新源。
$ sudo apt update
接着,我们可以使用 apt install package:arch
的方式安装软件,例如,使用下面的命令安装 ARM64 平台下的 libssl-dev
软件。
$ sudo apt install libssl-dev:arm64
此外,我们还需要用到 tcl8.6-dev
软件包。
$ sudo apt install tcl8.6-dev:arm64
编译 SQLite⌗
准备好依赖之后,我们便可以进行交叉编译了。
$ ../configure \
--target=aarch64-linux \
--host=aarch64-linux \
--prefix=/root/sqlite/build \
CFLAGS='-g -march=armv8-a -O2 -ftree-loop-vectorize -lcrypto' \
LDFLAGS='-static' \
CPP=/usr/bin/aarch64-linux-gnu-cpp \
CC=/usr/bin/aarch64-linux-gnu-gcc
$ make -j $(nproc) -s
$ make install -s
参考⌗
[1] https://jensd.be/1126/linux/cross-compiling-for-arm-or-aarch64-on-debian-or-ubuntu