2016-07-01 2 views
4

Глядя в 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?

+0

У вас есть ответ на ваш вопрос в другом месте? – mgautierfr

+0

@mgautierfr Нет, я так и не получил ответа. Я не горжусь этим, но мой взлом для определения «ELF64_ST_INFO» работал достаточно хорошо, и я не стал связываться с Google по этой проблеме. –

ответ

2

Это была ошибка в NDK. Чтобы проиллюстрировать важность регистрации ошибок, это было подано 8 часов назад, и у нас уже есть исправление, проходящее через presubmit: https://github.com/android-ndk/ndk/issues/377. Исправление должно быть доступно в r15 beta 2, которое должно появиться при I/O (17 мая).

+0

NDK r15 по-прежнему не содержит этого исправления. Будет ли он включен в NDK r15b? – pelya

+0

https://gist.github.com/DanAlbert/918b8834efcb0a472657688ea5b67b82 работает для меня –

+0

grep -r ELF64_ST_INFO android-ndk-r15/platform/android-21 дает мне нулевые результаты, NDK скачано здесь: https://dl.google .com/android/repository/android-ndk-r15-linux-x86_64.zip и платформы/android-19 содержит это определение – pelya