定位独立可执行文件和Android棒棒糖

我写了一个.c源代码(在ecllipse中),它使用libcap库来获取有关networkingstream量的信息。 现在我已经通过在ecllipse中使用ndk-build创build了一个可执行的二进制文件。 我把libs / armeabi文件夹中创build的二进制文件推送到了我的android(rooted nexus 5,Lollypop)的/ data / local /文件夹,并试图执行二进制文件。 但android会抛出这个错误

错误:仅支持与位置无关的可执行文件(PIE)

我不知道PIE,请告诉我如何创build一个位置独立的可执行文件。

Solutions Collecting From Web of "定位独立可执行文件和Android棒棒糖"

我不知道PIE,请告诉我如何创建一个位置独立的可执行文件。

位置独立可执行文件或PIE允许程序重新定位,就像共享对象一样。 在程序的每次运行中,程序都可以加载到不同的地址,以使攻击者难以猜测某个程序状态。

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

如果您正在构建共享对象和程序,则使用-fPIC编译所有内容。 将共享对象与-shared链接,并将程序与-pie链接。

你不能这样做。 也就是说,你不能用-fPIE编译所有的东西,同时建立一个共享对象和一个程序。 有关详细信息,请参阅GCC手册中的代码生成选项 。


在Android上需要注意的一点是:4.1之前的PIE构建会导致/system/bin/linker的分段错误。 PIE被添加到Android 4.1,并且崩溃的版本较小。

有人告诉我提供一个自定义的链接/加载程序来避免这个问题,但目前我找不到这个参考。

另请参阅Android 1.5到4.1中的安全增强功能 。


错误:仅支持与位置无关的可执行文件(PIE)

是的,这是一个棒棒糖功能。 请参阅Android 5.0中的安全增强功能 。


您可以使用readelf检查程序是否使用PIE readelf

 $ readelf -l my-prog | grep -i "file type" Elf filetype is DYN (shared object file) 

readelf的重要部分是报告DYN ,而不报告EXEEXE意味着它缺少PIE,这应该引发安全相关的缺陷。


相关内容请参阅Android 4.0(ICS)中支持的主要可执行文件是否为PIE(与位置无关的可执行文件)?

我知道这是一个古老的话题,但这种方法可能会节省一些人的时间
用十六进制编辑器,找到第17个字节,将值02更改为03,就是这样!