抱歉,序言太长了,但是这里有……
我希望能够在我的手机上读取我的 LUKS 加密 USB 驱动器,因此我正在寻找适用于 Android 的 cryptsetup。我发现了一个废弃的Guardian Project 存储库,它让我找到了一篇关于在 Fedora 11 上编译静态二进制文件的旧博客文章。Guardian Project 存储库似乎使用了博客文章中的想法,而不是使用 armv5tel-redhat-linux-gnueabi- gcc-c++,它使用 Android NDK。Play Store 上有一个应用程序声称使用了这个 repo 中的想法,它还提供了一个 GUI。XDA 论坛上还有一个线程,用户提供使用 Android NDK 编译的静态二进制文件。
然而,这些已经过时或不可信。现在 Debian 已经打包了一个可以针对 armel/armhf 架构的 GNU 交叉编译器,我想尝试使用它来构建 cryptsetup。使用 Debian 工具的优点是下载/安装的大小要小得多。缺点是较大的二进制文件。使用来自这个 Github gist的想法,我最终得到了以下实现结果的 shell 脚本:
arch=armel;triplet=arm-linux-gnueabi
#arch=armhf;triplet=arm-linux-gnueabihf #either option works
DEVMAPPERDIR=$HOME/libdevmapper
sudo dpkg --add-architecture $arch
#enable unstable sources
echo 'deb-src http://deb.debian.org/debian/ sid main'|sudo tee -a /etc/apt/sources.list
sudo apt update
#toolchain
sudo apt -y install gcc-$triplet dpkg-dev autopoint automake libtool pkg-config
#package compilation dependencies
sudo apt -y install libselinux1-dev:$arch libgcrypt20-dev:$arch uuid-dev:$arch libpopt-dev:$arch libjson-c-dev:$arch
apt-get source cryptsetup lvm2
cd lvm2-*
#patch for linking errors
sed -i 's/SELINUX_LIBS="-lsepol"/SELINUX_LIBS="-lsepol -lpcre"/' configure
./configure --enable-static-link --enable-pkgconfig --prefix=$DEVMAPPERDIR --host=$triplet ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes
make install_device-mapper
cd ../cryptsetup-*
./autogen.sh && ./configure --enable-static-cryptsetup --host=$triplet PKG_CONFIG_PATH="$DEVMAPPERDIR/lib/pkgconfig" CFLAGS="-I$DEVMAPPERDIR/include/" LDFLAGS="-Wl,-rpath-link,$DEVMAPPERDIR/lib"
make install DESTDIR=$HOME/cryptsetup
libdevmapper-dev 的打包版本不包含静态库,因为它依赖于已放弃对静态构建的支持的 udev。由于 cryptsetup不需要udev ,我从源代码编译 libdevmapper 并在编译 cryptsetup 时传递了适当的标志。
现在我来回答问题:
- 我这样做对吗?
- 由于 Debian Stretch 打包的 glibc 的要求,如此获得的二进制文件需要 Linux v3.2(Android v4.2 )或更高版本。是否有一些针对早期内核的简单方法?Debian Jessie 允许以 v2.6.32 (Android v2.2) 为目标,但没有交叉编译器。
- Android NDK FOSS 吗?