Можем ли мы включить pie (т.е. Устанавливать независимые исполняемые файлы) для разделяемых библиотек в android-ndk r10c?

Можем ли мы включить pie (т.е. использовать независимые исполняемые файлы) для разделяемых библиотек в android-ndk r10c? И если да, то как это сделать?

Я читал, что мы должны использовать PIC для динамических библиотек и PIE для исполняемых файлов, но выглядит так, как Android NDK не поддерживает PIC.

Я попытался включить флаг -pie в LDFLAGS, но я получаю следующую ошибку:

/android-ndk-r10c/platforms/android-19/arch-arm/usr/lib/crtbegin_dynamic.o:
  in function _start:crtbrand.c(.text+0x8c): error: undefined reference to 'main'

Пожалуйста, помогите мне решить эту проблему, поскольку я прочитал, что Google будет указывать PIE в будущих версиях Android, поэтому я хочу, чтобы мое приложение совместимо с ANDROID-L +.

Ответ 1

На самом деле, если вы создаете общие библиотеки (в отличие от исполняемых файлов), вам не нужно ничего делать. Библиотеки, которые работают в старых версиях Android, будут работать отлично - ничто не изменилось в Android 5.0 по отношению к этому.

Почти так же, если вы создаете исполняемые файлы с помощью Android.mk и настраиваете Android 4.1+, необходимые флаги должны быть добавлены автоматически уже.

Полная история. Причина, по которой вы отказались, когда пытаетесь добавить флаг -pie в LDFLAGS для библиотек, заключается в том, что этот флаг предназначен только для исполняемых файлов, а не для библиотек. При создании разделяемых библиотек флаг флага -fPIC (при создании отдельных объектных файлов при запуске компилятора вручную - Android.mk и ndk-build позаботится об этом автоматически) может потребоваться на некоторых архитектурах, но вы заметите, что это необходимо, потому что компоновщик откажется предоставить общую библиотеку, если это необходимо, и вы ее не установили. Таким образом, если у вас есть проблема, которую вы уже знаете, потому что она не сработает - если вы ее успешно создали, у вас нет проблем.

Аналогично при создании исполняемых файлов вам нужно добавить -fPIE при создании объектных файлов и -fPIE -pie при связывании исполняемых файлов. Android.mk и ndk-build позаботятся об этом автоматически, если ваша APP_PLATFORM - Android-16 (Android 4.1) или выше. Здесь большие gotcha - исполняемые файлы, созданные с помощью -pie, будут работать только на android-16 или выше, а исполняемые файлы, созданные без -pie, не будут работать на Android-21 (Android 5.0). Таким образом, здесь льготный период, Android 4.1 до 4.4 будет запускать любой исполняемый файл просто отлично, хотя вам явно нужна версия без -pie для более старых, а другая версия с -pie для более новых.

Если вам нужно настроить таргетинг на версии Android до 4.1, см. fooobar.com/questions/115128/... для объяснения того, как легко создавать две версии исполняемого файла.

Ответ 2

Можем ли мы включить pie (т.е. выполнять независимые исполняемые файлы) для разделяемых библиотек в android-ndk r10c?

PIE был представлен в Android 4.1/ android-16 (см. Android <uses-sdk>), но он был необязательным. См. Улучшения безопасности в Android от 1.5 до 4.1. Поэтому я думаю, что это меньше зависит от версии NDK и больше от версии Android.

Когда я пытаюсь запустить код PIE на Android 4.0 или ниже, я получаю segfault в /system/bin/linker. Это с HTC Evo 4G. Ваш пробег может отличаться, в зависимости от того, насколько надежным является ссылка/загрузчик OEM. Также см. Является ли PIE (независимый от позиции исполняемый файл) для основных исполняемых файлов, поддерживаемых в Android 4.0 (ICS)?

Теперь PIE требуется для Android 5.0 и выше. Также см. Улучшения безопасности в Android 5.0.

Если вы попытаетесь выполнить компиляцию/ссылку для Android 5.0/ android-21 (см. Android <uses-sdk>), и без PIE, тогда вы получит сообщение об ошибке. Также см. Позиция независимых исполняемых файлов и Android Lollipop.


Можем ли мы включить pie... для разделяемых библиотек в android-ndk

И короткое слово об очевидном (как только вы это узнаете). PIC немного отличается от PIE. Вы используете PIE для исполняемых программ и PIC для общих объектов.

Если вы создаете исполняемый и совместно используемый объект из одного и того же набора источников и объектных файлов, тогда вы будете использовать PIC, потому что PIC работает для обоих (тот же не > true для PIE). Также см. Позиция независимых исполняемых файлов и Android Lollipop.


И если да, то как это сделать?

Вы можете скомпилировать и связать исполняемый файл PIE одним из двух способов. Во-первых, скомпилируйте все с помощью -fPIE и свяжите с -pie. Во-вторых, скомпилировать все с помощью -fPIC и связать с -pie.

Если вы создаете исполняемый и совместно используемый объект из одного и того же набора источников и объектных файлов, тогда вы будете использовать PIC, потому что PIC работает для обоих (тот же не > true для PIE). Также см. Позиция независимых исполняемых файлов и Android Lollipop.