交叉编译内核工具,即使 -L 设置正确也找不到 -lelf

Cross-compiling kernel tools, cannot find -lelf even with -L set correctly

我正在尝试在我的 amd64 机器上为 armhf 交叉编译官方 Debian 内核的修改版本。我正在使用 Debian wiki 上的 HowToCrossBuildAnOfficialDebianKernelPackage 说明。

内核本身构建良好,但在尝试为 linux-kbuild 包构建 objtool 时我从 ld 收到错误:

# make -f debian/rules.real build-kbuild KBUILD_HOSTLDFLAGS="-L/usr/lib/arm-linux-gnueabihf"
[...]
arm-linux-gnueabihf-gcc /usr/src/linux.buster-backports/debian/build/build-tools/tools/objtool/objtool-in.o -lelf /usr/src/linux.buster-backports/debian/build/build-tools/tools/objtool/libsubcmd.a -L/usr/lib/arm-linux-gnueabihf -o /usr/src/linux.buster-backports/debian/build/build-tools/tools/objtool/objtool
/usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lelf
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:67: /usr/src/linux.buster-backports/debian/build/build-tools/tools/objtool/objtool] Error 1

您可以看到 make 确实将 -L/usr/lib/arm-linux-gnueabihf 标志添加到 gcc/usr/lib/arm-linux-gnueabihf 确实包含 libelf:

# ls -l /usr/lib/arm-linux-gnueabihf/libelf*
-rw-r--r-- 1 root root 67296 May 28  2019 /usr/lib/arm-linux-gnueabihf/libelf-0.176.so
lrwxrwxrwx 1 root root    15 May 28  2019 /usr/lib/arm-linux-gnueabihf/libelf.so.1 -> libelf-0.176.so

# file /usr/lib/arm-linux-gnueabihf/libelf-0.176.so
/usr/lib/arm-linux-gnueabihf/libelf-0.176.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=51d60560aa6c0538f0bf34c07e4e2bc230c00834, stripped

我这样安装libelf

dpkg --add-architecture armhf
apt-get update
apt-get install libelf1:armhf

正在使用的 ld 似乎是用于手臂的:

# /usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld -V
GNU ld (GNU Binutils for Debian) 2.31.1
  Supported emulations:
   armelf_linux_eabi
   armelfb_linux_eabi

我很难过。如何将 ld 变为 link libelf

libelf-0.176.solibelf.so.1 都不被链接器的 -lelf 选项搜索。您还需要 libelf.so 个文件。可以创建此文件:

  • 通过安装 libelf-dev 包(像往常一样,.so 的库由 *-dev 包安装)。请务必选择适合 cross-compiling.
  • 的套餐
  • 通过创建符号链接 libelf.so 指向您拥有的 libelf-0.176.so 文件。