Можем ли мы включить 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.