为什么从Android NDK中删除了exec_elf.h?

时间:2016-07-01 17:44:03

标签: android android-ndk

在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中的错误?

1 个答案:

答案 0 :(得分:2)

这是NDK中的一个错误。为了说明提交错误的重要性,这是在8小时前提交的,我们已经通过预先提交修复:https://github.com/android-ndk/ndk/issues/377。该修复程序应该在r15 beta 2中提供,将在I / O(5月17日)发布。