我们可以为android-ndk r10c中的共享库启用pie(即Position Independent Executables)吗?

ssk*_*ssk 11 android android-ndk

我们可以为android-ndk r10c中的共享库启用pie(即Position Independent Executables)吗?如果是,那该怎么办?

我读到我们应该将PIC用于动态库,PIE用于可执行文件,但看起来像android NDK不支持PIC.

我尝试在LDFLAGS中启用-pie标志,但是我收到以下错误:

/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'
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题,因为我已经读过谷歌将在即将到来的Android版本中强制要求PIE,所以我希望我的应用程序与ANDROID-L +兼容.

mst*_*sjo 14

真正的简短故事是,如果您正在构建共享库(而不是可执行文件),则不需要执行任何操作.在较旧版本的Android上运行的库将继续正常工作 - 在Android 5.0中没有任何改变.

几乎同样简短的故事是,如果您使用Android.mk构建可执行文件并定位到Android 4.1+,则必须自动添加必要的标记.

完整的故事:当您尝试将-pie标志添加到LDFLAGS的库时,您失败的原因是此标志仅适用于可执行文件,而不适用于库.在构建共享库时,编译器标志-fPIC(在构建单个目标文件时,如果手动运行编译器 - Android.mk和ndk-build自动处理)可能需要某些体系结构,但您会注意到它是必需的,因为如果需要,链接器将拒绝生成共享库,而您尚未设置它.因此,如果您遇到问题,您将会知道它将无法构建 - 如果您已成功构建它,则不会有任何问题.

类似地,在构建可执行文件时,您需要-fPIE在构建目标文件时以及-fPIE -pie链接可执行文件时添加.如果你的APP_PLATFORM是android-16(Android 4.1)或更高版本,Android.mk和ndk-build会自动处理这个问题.这里有大问题 - 构建的可执行文件-pie只能在android-16或更高版本上运行,而不构建的可执行文件-pie将无法在android-21(Android 5.0)上运行.所以这里有一个宽限期,Android 4.1到4.4将运行任何可执行文件就好了,而你明确需要一个没有-pie旧版本的版本和另一个版本-pie的新版本.

如果您需要4.1之前指定Android版本上,请/sf/answers/1849599881/关于如何轻松地建立可执行的两个版本的解释.