在Android NDK r12中,我可以看到在platforms / android- {API level} / {arch} / usr / include / sys下的头文件存在差异。对于API级别19及以下,文件exec_elf.h存在,但在此之后似乎已被删除。添加或删除文件有许多其他差异,但我对exec_elf.h感兴趣,因为它定义了一个特定的宏:
#define ELF64_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf))
这个宏用在ICU源代码中,如果我使用API目标设置为19之后的任何东西的工具链,我的交叉编译的ICU构建失败。构建失败并出现以下错误:
arm-linux-androideabi-clang ... icu/source/tools/toolutil/pkg_genc.c
icu/source/tools/toolutil/pkg_genc.c:869:13: warning: implicit declaration of function 'ELF64_ST_INFO' is invalid in C99 [-Wimplicit-function-declaration]
ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT),
^
icu/source/tools/toolutil/pkg_genc.c:869:13: error: initializer element is not a compile-time constant
ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT),
^~~~~~~~~~~~~~~~~~~
icu/source/tools/toolutil/pkg_genc.c:987:13: error: initializer element is not a compile-time constant
ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT),
编译行如下:
android-toolchain/bin/arm-linux-androideabi-clang -D_REENTRANT -DU_HAVE_ELF_H=1 \
-DU_HAVE_ATOMIC=1 -Iicu/source/common -Iicu/source/i18n \
-DU_BUILD="x86_64-apple-darwin15.2.0" -DU_HOST="arm-unknown-linux-androideabi" \
-DU_CC="android-toolchain/bin/arm-linux-androideabi-clang" \
-DU_CXX="android-toolchain/bin/arm-linux-androideabi-clang++" \
-DUNISTR_FROM_CHAR_EXPLICIT=explicit -DUNISTR_FROM_STRING_EXPLICIT=explicit \
-DU_ATTRIBUTE_DEPRECATED= -DU_TOOLUTIL_IMPLEMENTATION -O3 -O2 -pipe -fsigned-char \
-fPIC -D__ANDROID__ -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -std=c99 \
-Wall -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -c \
-DPIC -fPIC -o pkg_genc.o icu/source/tools/toolutil/pkg_genc.c
我可以通过在pkg_genc.c的顶部添加ELF64_ST_INFO
的定义来使构建成功,所以我非常肯定Android系统头中缺少此宏的定义是问题。有谁知道为什么这会在API级别上发生变化?这是有意的,或者这是NDK中的错误?
答案 0 :(得分:2)
这是NDK中的一个错误。为了说明提交错误的重要性,这是在8小时前提交的,我们已经通过预先提交修复:https://github.com/android-ndk/ndk/issues/377。该修复程序应该在r15 beta 2中提供,将在I / O(5月17日)发布。