Извините за длинную преамбулу, но здесь идет ...
Я хочу иметь возможность читать мой зашифрованный USB-накопитель LUKS на моем телефоне, и поэтому я искал cryptsetup для Android.Я нашел заброшенный репозиторий Guardian Project , который привел меня к старому сообщению в блоге о компиляции статического бинарного файла в Fedora 11. Репо Guardian Project использует идеи из поста в блоге.но вместо использования armv5tel-redhat-linux-gnueabi-gcc-c ++ используется Android NDK.В Play Store есть приложение, которое утверждает, что использует идеи из этого репозитория, а также предоставляет графический интерфейс.На форумах XDA есть также ветка, в которой пользователь предоставляет статические двоичные файлы, скомпилированные с использованием Android NDK.
Однако они устарели или не заслуживают доверия.Теперь, когда Debian упаковал кросс-компилятор GNU, который может быть нацелен на архитектуру armel / armhf, я хотел попробовать создать cryptsetup, используя его.Преимущество использования инструментов Debian заключается в гораздо меньшем размере загрузки / установки.Недостатком является бинарный файл большего размера.Используя идеи из этого Github gist , я получил следующий сценарий оболочки, который достигает результата:
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, который отказался от поддержки статических сборок.Поскольку udev не требуется для cryptsetup, я скомпилировал libdevmapper из исходного кода и передал соответствующие флаги при компиляции cryptsetup.
Теперь я перехожу к вопросам:
- Правильно ли я это делаю?
- Полученный бинарный файл требует Linux v3.2 ( Android v4.2 ) или выше из-за требований glibc, поставляемого с Debian Stretch.Есть ли какой-нибудь простой способ нацеливания на более раннее ядро?Debian Jessie разрешит таргетинг на v2.6.32 (Android v2.2), но кросс-компилятора нет.
- Является ли Android NDK FOSS?