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

我们可以在android-ndk r10c中启用共享库的饼图(即Position Independent Executables)吗? 如果是的话,该怎么做?

我读到,我们应该使用PICdynamic库和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' 

请帮我解决这个,因为我已经读过谷歌将在即将到来的android版本中强制PIE,所以我想我的应用程序与ANDROID-L +兼容。

Solutions Collecting From Web of "我们可以在android-ndk r10c中启用共享库的饼图(即Position Independent Executables)吗?"

真正的小故事是,如果你正在构build共享库(而不是可执行文件),你不需要做任何事情。 在老版本的Android上运行的库会继续工作,没有什么比Android 5.0更好的了。

简言之,如果您使用Android.mk构build可执行文件并且定位到Android 4.1+,则必须自动添加必要的标志。

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

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

如果您需要定位4.1之前的Android版本,请参阅https://stackoverflow.com/a/26422855/3115956,获取有关如何轻松构build两个版本的可执行文件的说明。

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

PIE是在Android 4.1 / android-16 (见Android <uses-sdk> )中引入的,但它是可选的。 请参阅Android 1.5到4.1中的安全增强function 。 所以我认为这取决于NDK版本,更多取决于Android版本。

当我尝试在Android 4.0或更低版本上运行PIE代码时,我在/system/bin/linker遇到了段错误。 这是与HTC Evo 4G。 您的里程可能会有所不同,具体取决于OEM提供的链接/加载程序的强大程度。 另请参阅Android 4.0(ICS)支持的主要可执行文件是PIE(与位置无关的可执行文件)?

现在,Android 5.0及更高版本需要PIE。 另请参阅Android 5.0中的安全增强function 。

如果您尝试为Android 5.0 / android-21 (请参阅Android <uses-sdk> )编译/链接,并且没有PIE,则会出现链接错误。 另请参阅位置独立可执行文件和Android棒棒糖 。


我们可以启用馅饼…在android-ndk共享库

还有一个很明显的话(一旦你知道了)。 PICPIE略有不同。 您在可执行程序上使用PIE,在共享对象上使用PIC。

如果您从同一组源和目标文件构build可执行和共享对象,那么您将使用PIC,因为PIC适用于两者(PIE 也不相同)。 另请参阅位置独立可执行文件和Android棒棒糖 。


如果是的话,该怎么做?

您可以通过以下两种方式之一来编译和链接PIE可执行文件。 首先,用-fPIE编译所有内容,并与-pie链接。 第二个是使用-fPIC编译所有内容,并与-pie链接。

如果您从同一组源和目标文件构build可执行和共享对象,那么您将使用PIC,因为PIC适用于两者(PIE 也不相同)。 另请参阅位置独立可执行文件和Android棒棒糖 。