mylib.so有文本重定位。这会浪费内存并且存在安全风险。请修理

时间:2013-11-22 09:39:52

标签: android native android-4.4-kitkat

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

  

链接器mylib.so具有文本重定位。这会浪费内存并且存在安全风险。请修理。

你知道它是什么以及如何修复它吗? 谢谢,

4 个答案:

答案 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)

我的应用程序出现了同样的错误。 该应用程序使用本机守护程序,该守护程序使用本机库,该库未在其头文件中实现所有功能。当我将所需的实现添加到本机库时,一切正常。

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