42

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

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

你知道它是什么以及如何解决它吗?谢谢,

4

4 回答 4

26

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

并声明从 ndk-r8c 开始已修复。

似乎最近才添加了对有问题的库的检查。

注意:请不要编辑此帖子以隐藏链接 URL。它是明确的,因为目的地是使其具有权威性的原因。

进一步注意更改 NDK 版本仅当警告是由于您的应用程序代码引起的时修复。如果警告出现在诸如 libdvm 之类的系统组件上,它将无效——只能通过系统更新来修复。

于 2013-12-02T23:19:28.840 回答
4

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

于 2015-08-19T15:48:45.033 回答
4

简而言之,您需要使用-fpicor-fPIC标志之一编译您的库,其中PICPosition 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。有关如何编写适当的动态库的详细信息,这是必读的

于 2017-03-29T17:05:07.433 回答
1

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

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

于 2014-09-28T13:27:17.523 回答