交叉编译内核工具,即使 -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.so
和 libelf.so.1
都不被链接器的 -lelf
选项搜索。您还需要 libelf.so
个文件。可以创建此文件:
- 通过安装
libelf-dev
包(像往常一样,.so
的库由 *-dev
包安装)。请务必选择适合 cross-compiling. 的套餐
- 通过创建符号链接
libelf.so
指向您拥有的 libelf-0.176.so
文件。
我正在尝试在我的 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.so
和 libelf.so.1
都不被链接器的 -lelf
选项搜索。您还需要 libelf.so
个文件。可以创建此文件:
- 通过安装
libelf-dev
包(像往常一样,.so
的库由*-dev
包安装)。请务必选择适合 cross-compiling. 的套餐
- 通过创建符号链接
libelf.so
指向您拥有的libelf-0.176.so
文件。