Глядя в Android NDK r12, я вижу, что есть различия в файлах заголовков под платформами/android- {API level}/{arch}/usr/include/sys. Для уровней API 19 и ниже файл exec_elf.h существует, но, как представляется, был удален после этого. Есть целый ряд других отличий, где были добавлены или удалены файлы, но я заинтересован в exec_elf.h, потому что она определяет конкретный макрос:Почему был удален exec_elf.h из Android NDK?
#define ELF64_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf))
Этот макрос используется в источнике ICU, и мой кросс- скомпилировано сборка СИСА терпит неудачу, если я использую набор инструменты с целью API, установленной на что-либо после 19. сборки терпит неудачу с этими ошибками:
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
я могуполучить сборку, чтобы добиться успеха, добавив определение ELF64_ST_INFO
в верхней части pkg_genc.c, поэтому я довольно уверен, что отсутствие определения этого макроса в заголовках системы Android является проблемой. Кто-нибудь знает, почему это изменилось по уровням API? Разве это различие преднамеренное, или это ошибка в NDK?
У вас есть ответ на ваш вопрос в другом месте? – mgautierfr
@mgautierfr Нет, я так и не получил ответа. Я не горжусь этим, но мой взлом для определения «ELF64_ST_INFO» работал достаточно хорошо, и я не стал связываться с Google по этой проблеме. –