mylib.so有文本重定位。 这是浪费记忆,是一个安全风险。 请修复

我的Android应用程序(使用本机库)在Android 4.4上打印此警告:

链接器mylib.so有文本重定位。 这是浪费记忆,是一个安全风险。 请修复。

你有没有想到它是什么以及如何解决它? 谢谢,

这似乎是https://code.google.com/p/android/issues/detail?id=23203上提到的两个ndk-gcc错误的结果;

并说在那里已经被固定为ndk-r8c。

似乎这个问题的图书馆检查只是最近才被添加的。

注意:请不要编辑这个post来隐藏链接的URL。 这是明确的,因为目的地是权威性的。

进一步的注意事项只有当警告是由于您的应用程序的代码而更改NDK版本。 如果系统组件(如libdvm)只能通过系统更新修复警告,它将不起作用。

您需要使您的库中的代码独立…将-fpic-fPIC添加到您的Android.mk中的LOCALC_FLAGS中,并且还需要确保不会链接到包含文本重定位的任何静态或共享库他们自己。 如果他们这样做,你可以重新编译它们,使用上面提到的标志之一。

简而言之,您需要使用-fpic-fPIC标志之一编译您的库,其中PIC是位置独立代码的缩写。

较长的答案是,您的yourlib.so已经以不符合Google Android标准的ELF文件的方式进行编译,其中此Dynamic Array Tag条目是意外的。 在最好的情况下,图书馆仍然会运行,但仍然是一个错误,未来的AOS版本可能不会允许它运行。

DT_TEXTREL 0x16 (22)

要检查你库中的内容,请使用以下内容:

 # readelf --wide -S yourlib.so There are 37 section headers, starting at offset 0x40: Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 0000000000000000 002400 068f80 00 AX 0 0 16 [ 2] .rodata PROGBITS 0000000000000000 06b380 05ad00 00 WA 0 0 32 ... [16] .rela.text RELA 0000000000000000 26b8e8 023040 18 14 1 8 ... [36] .rela.debug_frame RELA 0000000000000000 25a608 0112e0 18 14 27 8 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) 

请参阅我在这个主题上的广泛答案 ,了解更多DT entry详细信息。 有关如何编写适当的dynamic库的详细信息, 这是一个必读 。

我得到了与我的应用程序相同的错误。 该应用程序使用本机守护进程,该守护进程使用本地库,而不是在其头文件中实现所有function。 当我将所需的实现添加到本地库时,所有的工作都完成了。

我不知道你是否有完全相同的问题,但它可能意味着你的本地方有一些不匹配。