ssk*_*ssk 11 android android-ndk
我们可以为android-ndk r10c中的共享库启用pie(即Position Independent Executables)吗?如果是,那该怎么办?
我读到我们应该将PIC用于动态库,PIE用于可执行文件,但看起来像android NDK不支持PIC.
我尝试在LDFLAGS中启用-pie标志,但是我收到以下错误:
Run Code Online (Sandbox Code Playgroud)/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'
请帮我解决这个问题,因为我已经读过谷歌将在即将到来的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/关于如何轻松地建立可执行的两个版本的解释.
| 归档时间: |
|
| 查看次数: |
7785 次 |
| 最近记录: |