我的Android应用程序(使用本机库)在Android 4.4上打印此警告:
链接器mylib.so具有文本重定位。这会浪费内存并且存在安全风险。请修理。
你知道它是什么以及如何修复它吗? 谢谢,
答案 0 :(得分:26)
这似乎是https://code.google.com/p/android/issues/detail?id=23203
中提到的两个ndk-gcc错误的结果并声明已经修复了ndk-r8c。
似乎最近才添加了对具有该问题的库的检查。
注意:请不要编辑此帖子以隐藏链接网址。它是明确的,因为目的地是使其具有权威性的。
进一步注意当警告是由您的应用程序代码引起时,更改NDK版本只是一种修复。如果警告改为系统组件(如libdvm),它将具有无效 - 只能通过系统更新修复。
答案 1 :(得分:4)
您需要将库中的代码位置独立...将-fpic
或-fPIC
添加到Android.mk中的LOCALC_FLAGS
,您还需要确保&# 39;不要链接任何包含文本重定位的静态或共享库。如果他们这样做并且您可以重新编译它们,请使用上面提到的标志之一。
答案 2 :(得分:3)
简而言之,您需要使用-fpic
或-fPIC
标记之一编译库,其中 PIC 是Position Independent Code的缩写。
答案较长的是,您的 yourlib.so 的编译方式不符合ELF文件的Google Android标准,此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
详细信息,请参阅有关该主题的my extensive answer。有关如何编写适当的动态库this is a must-read的详细信息。
答案 3 :(得分:1)
我的应用程序出现了同样的错误。 该应用程序使用本机守护程序,该守护程序使用本机库,该库未在其头文件中实现所有功能。当我将所需的实现添加到本机库时,一切正常。
我不知道你是否有完全相同的问题,但这可能意味着你的原生方有一些不匹配。