交叉编译记录

来自百合仙子's Wiki
跳转到导航 跳转到搜索

本页记录各软件交叉编译时要注意的事项。没有特别说明的均为 autotools 或者兼容的方法:

../configure --host=arm-unknown-linux-gnueabi ....
make
make DESTDIR=xxx install

zsh

如果--enable-pcre-lpcre失败,config.h将会是错误的。

使用 Android NDK 编译的话,中文显示异常。

Android 版编译过程[1]

LDFLAGS=-L/ldata/media/temp/android/installed_binaries/lib \
  CC='arm-linux-androideabi-gcc --sysroot=/opt/android-ndk/platforms/android-14/arch-arm' \
  ./configure --host=arm-linux-gnu --prefix=/system --with-term-lib=ncurses \
  --disable-multibyte --bindir=/system/xbin

修改:

  • Src/init.c关于TIOCSETD的代码注释掉,不然程序会卡在这个 ioctl 调用上
  • config.h注释掉HAVE__MKTEMP
  • Src/signal.c:432WCONTINUED改成WSTOPPED,不然恢复挂起的进程时会失败,得到「unknown signal」的提示

最后可将 ncurses 静态链接进去:

arm-linux-androideabi-gcc --sysroot=/opt/android-ndk/platforms/android-14/arch-arm \
  -L/ldata/media/temp/android/installed_binaries/lib -rdynamic \
  -o zsh main.o `cat stamp-modobjs` -ldl -lm -lc /ldata/media/temp/android/installed_binaries/lib/libncurses.a

htop

[2]

path+=/ldata/DATA/soft/arm-lilydjwg-linux-gnueabi/bin
mkdir android-build && cd android-build
CFLAGS='-I/ldata/DATA/android/ncurses-6.0/system/include -I/ldata/DATA/android/ncurses-6.0/system/include/ncurses -mfloat-abi=hard' LDFLAGS='-L/ldata/DATA/android/ncurses-6.0/system/lib' ../configure --host=arm-lilydjwg-linux-gnueabi --prefix=/system --bindir=/system/xbin
make
# 改成静态链接

lsof

[3]

path+=/ldata/txtfiles/soft/arm-lilydjwg-linux-gnueabi/bin
LSOF_CC=arm-lilydjwg-linux-gnueabi-gcc LSOF_CFGF='-DHAS_STRFTIME -DHASNORPC_H -DGLIBCV' LSOF_VERS=3.0.8 ./Configure -n linux
make
arm-lilydjwg-linux-gnueabi-gcc -o lsof -static dfile.o dmnt.o dnode.o dproc.o dsock.o dstore.o arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o -L./lib -llsof
arm-lilydjwg-linux-gnueabi-strip lsof

dig, host, nslookup

path+=/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin
BUILD_CC=gcc \
  CC='arm-linux-androideabi-gcc --sysroot=/opt/android-ndk/platforms/android-18/arch-arm' \
  CXX='arm-linux-androideabi-g++ --sysroot=/opt/android-ndk/platforms/android-18/arch-arm' \
  ../configure --host=arm-linux-gnu --prefix=/system --bindir=/system/xbin \
  --enable-epoll --without-openssl --without-gssapi --disable-static --with-randomdev=/dev/urandom

zlib

CHOST=arm-dyne-linux-gnueabi ./configure
make DESTDIR=/ldata/media/temp/kindle/software/zlib-1.2.8 install

openssl

CC=arm-dyne-linux-gnueabi-gcc LD=arm-dyne-linux-gnueabi-ld AR=arm-dyne-linux-gnueabi-ar RANLIB=arm-dyne-linux-gnueabi-ranlib ./Configure shared linux-armv4
make
# install 目标会安装一堆文档
make INSTALL_PREFIX=/ldata/media/temp/kindle/software/openssl-1.0.1e install_sw

Python

参见 Python#交叉编译

ncurses

path+=/ldata/DATA/soft/arm-lilydjwg-linux-gnueabi/bin
../configure --host=arm-lilydjwg-linux-gnueabi --with-shared --with-normal --without-debug --without-ada --enable-pc-files --enable-widec --without-manpages --prefix=/system
make
make DESTDIR=/ldata/DATA/android/ncurses-6.0 install

记得复制需要的 terminfo 文件。

注意安装的 pkgconfig 文件位于 /usr/lib 下,需要手动移动。

或者使用 Android NDK:

CC='aarch64-linux-android-gcc --sysroot=/opt/android-ndk/platforms/android-23/arch-arm64 -pie -fpie -fPIE -I/opt/android-ndk/sysroot/usr/include' LDFLAGS=-L/opt/android-ndk/platforms/android-23/arch-arm64/lib ../configure --host=aarch64-linux-android --prefix=/system --bindir=/system/xbin --with-shared --with-normal --without-debug --without-ada --enable-pc-files --enable-widec --without-manpage

libxslt

../configure --host=arm-dyne-linux-gnueabi --without-python --without-crypto

SQLite3

../configure --host=arm-lilydjwg-linux-gnueabi --disable-tcl

file

../configure --host=arm-lilydjwg-linux-gnueabi --enable-static --bindir=/system/xbin --prefix=/system
make
cd src
arm-lilydjwg-linux-gnueabi-gcc -static -std=gnu99 -fvisibility=hidden -O2 -o file file.o .libs/libmagic.a
arm-linux-androideabi-strip file
# then use file and magic.mgc
# magic.mgc must be in /system/share/misc/

使用 Android NDK 时可能会报链接错误。

tinyssh

参见主条目tinyssh

tcpdump

先编译 pcap 库:

CC='aarch64-linux-android-gcc --sysroot=/opt/android-ndk/platforms/android-23/arch-arm64 -pie -fpie -fPIE -I/opt/android-ndk/sysroot/usr/include' ../configure --host=aarch64-linux-android --prefix=/system --bindir=/system/xbin --with-pcap=linux

然后编译 tcpdump 本身:

CC='aarch64-linux-android-gcc --sysroot=/opt/android-ndk/platforms/android-23/arch-arm64 -pie -fpie -fPIE -I/home/lilydjwg/soft/android/binaries/aarch64-prefix/system/include -L/home/lilydjwg/soft/android/binaries/aarch64-prefix/system/lib -I/opt/android-ndk/sysroot/usr/include' LDFLAGS=-L/opt/android-ndk/platforms/android-23/arch-arm64/lib ../configure --host=aarch64-linux-android --prefix=/system --bindir=/system/xbin

最后修改最后一步链接的参数,把 -lpcap 改为 -Wl,-static -lpcap -Wl,-dy

参考资料