我的 Android 应用程序(使用本机库)在 Android 4.4 上打印此警告:
链接器 mylib.so 具有文本重定位。这是浪费内存并且存在安全风险。请修复。
你知道它是什么以及如何解决它吗?谢谢,
我的 Android 应用程序(使用本机库)在 Android 4.4 上打印此警告:
链接器 mylib.so 具有文本重定位。这是浪费内存并且存在安全风险。请修复。
你知道它是什么以及如何解决它吗?谢谢,
这似乎是 https://code.google.com/p/android/issues/detail?id=23203中提到的两个 ndk-gcc 错误的结果
并声明从 ndk-r8c 开始已修复。
似乎最近才添加了对有问题的库的检查。
注意:请不要编辑此帖子以隐藏链接 URL。它是明确的,因为目的地是使其具有权威性的原因。
进一步注意更改 NDK 版本仅当警告是由于您的应用程序代码引起的时修复。如果警告出现在诸如 libdvm 之类的系统组件上,它将无效——只能通过系统更新来修复。
您需要使您的库位置中的代码独立...添加-fpic
或添加-fPIC
到您LOCALC_FLAGS
的 Android.mk 中,并且您还需要确保您没有链接到任何包含文本重定位本身的静态或共享库。如果他们这样做并且您可以重新编译它们,请使用上面提到的标志之一。
简而言之,您需要使用-fpic
or-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)
我的应用程序遇到了同样的错误。该应用程序正在使用一个本机守护程序,该守护程序使用了一个本机库,该库未实现其头文件中的所有功能。当我将所需的实现添加到本机库时,一切正常。
我不知道你是否有完全相同的问题,但这可能意味着你的本地有一些不匹配。