[英]Build Android kernel ld vdso32 with error unrecognised emulation mode: armelf_linux_eabi
[英]`ld: unrecognised emulation mode: armelf_linux_eabi` when cross-compiling with Android NDK
我正在尝试与Android NDK交叉编译开源库libsndfile 。 我的主机是Windows 10下的Ubuntu子系统,目标是android系统(目前任何人都可以这样做)。 对于构建,我使用libsndfile的文档中所述的autogen + configure设置。 编译在链接阶段停止,产生一个冗长的日志文件(多于400行),其中包含多个错误。 在一开始的错误似乎非关键,但配置中所述探测编译器设置这个职位 。 最后一条错误消息指向链接器问题。 我认为这是日志文件的相关摘录:
#include "..." search starts here:
#include <...> search starts here:
/home/alan/android-ndk-r18/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/7.0.2/include
End of search list.
"/usr/bin/ld" --sysroot=../android-ndk-r18/platforms/android-17/arch-arm -z relro -X --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o a.out ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtbegin_dynamic.o -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib -L../android-ndk-r18/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib -L/home/alan/android-ndk-r18/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/7.0.2/lib/linux/arm -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib /tmp/conftest-5c2dd3.o -lgcc -ldl -lc -lgcc -ldl ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtend_android.o
/usr/bin/ld: unrecognised emulation mode: armelf_linux_eabi
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe
clang: error: linker command failed with exit code 1 (use -v to see invocation)
configure:4138: $? = 1
configure:4176: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "libsndfile"
| #define PACKAGE_TARNAME "libsndfile"
| #define PACKAGE_VERSION "1.0.29pre1"
| #define PACKAGE_STRING "libsndfile 1.0.29pre1"
| #define PACKAGE_BUGREPORT "sndfile@mega-nerd.com"
| #define PACKAGE_URL "http://www.mega-nerd.com/libsndfile/"
| #define PACKAGE "libsndfile"
| #define VERSION "1.0.29pre1"
| /* end confdefs.h. */
|
| int
| main ()
| {
|
| ;
| return 0;
| }
configure:4181: error: in `/home/alan/libsndfile':
configure:4183: error: C compiler cannot create executables
为了更加精确,我认为问题是/usr/bin/ld: unrecognised emulation mode: armelf_linux_eabi
。 人们似乎已经遇到这个问题,因为中可以看到这个帖子 ,但到目前为止,我还没有找到一个满意的答案。 按照关于SO的建议 ,我尝试通过使用--verbose
选项自行运行链接器来获取有关错误的更多信息:
"/usr/bin/ld" --verbose --sysroot=../android-ndk-r18/platforms/android-17/arch-arm -z relro -X --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o a.out ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtbegin_dynamic.o -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib -L../android-ndk-r18/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib -L/home/alan/android-ndk-r18/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/7.0.2/lib/linux/arm -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib /tmp/conftest-5c2dd3.o -lgcc -ldl -lc -lgcc -ldl ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtend_android.o
不幸的是,这对输出没有影响,与日志文件中的输出相同:
/usr/bin/ld: unrecognised emulation mode: armelf_linux_eabi
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe
有谁知道我下一步可以尝试什么?
最简单的解决方案是仅使用独立的工具链,以便我们为您处理详细信息。
如果由于某种原因不能使用它,那么您遇到的问题就是您错误地调用了编译器。
如果您通过GCC包装器调用它(r18中没有GCC; GCC二进制文件是调用Clang的脚本),那么您将运行到https://github.com/android-ndk/ndk/issues/ 805 。
如果直接调用Clang,则需要使用-gcc-toolchain
来告诉Clang binutils在哪里。 即
clang++ \
--target=armv7a-linux-androideabi17 \
-gcc-toolchain $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
请注意,如果您在发布NDK r19之后使用此答案,则答案会更加简单: https ://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md。
如果使用CMake进行编译时遇到这种情况,则可能是此处描述的CMake错误: https : //gitlab.kitware.com/cmake/cmake/issues/18739
简而言之,临时解决方法不是使用独立工具链,而是使用NDK的工具链:
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_STL=c++_shared -DANDROID_TOOLCHAIN=clang -DANDROID_PLATFORM=android-21 -DANDROID_ABI=arm64-v8a -DCMAKE_INSTALL_PREFIX=$_PROJECT_DIR/install/android/arm64-v8a
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.