Android mylib.so具有文本重定位。这是在浪费内存,是一种安全风险。请修理

Android mylib.so具有文本重定位。这是在浪费内存,是一种安全风险。请修理,android,native,android-4.4-kitkat,Android,Native,Android 4.4 Kitkat,我的Android应用程序(使用本机库)在Android 4.4上打印此警告: 链接器mylib.so具有文本重定位。这是在浪费内存,是一种安全风险。请修理 你知道它是什么以及如何修复它吗? 谢谢,这似乎是在 并声明自ndk-r8c起已固定 似乎最近才添加了对有此问题的库的检查 注意:请不要编辑此帖子以隐藏链接URL。它是明确的,因为目的地使它具有权威性 进一步注意当警告是由应用程序的代码引起时,更改NDK版本只是一种修复。如果警告出现在系统组件(如libdvm)上,则不会产生任何影响。该组件只

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

链接器mylib.so具有文本重定位。这是在浪费内存,是一种安全风险。请修理

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

这似乎是在

并声明自ndk-r8c起已固定

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

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


进一步注意当警告是由应用程序的代码引起时,更改NDK版本只是一种修复。如果警告出现在系统组件(如libdvm)上,则不会产生任何影响。该组件只能通过系统更新来修复。

我的应用程序也出现了相同的错误。 应用程序使用的本机守护程序使用的本机库没有实现其头文件中的所有函数。当我将所需的实现添加到本机库时,一切都正常工作


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

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

简而言之,您需要使用
-fpic
-fpic
标志之一编译库,其中PIC是的缩写

较长的答案是,您的yourlib.so的编译方式不符合针对ELF文件的Google Android标准,而此
动态数组标记
条目是意外的。在最好的情况下,库仍将运行,但这仍然是一个错误,未来的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条目的更多信息,请参见主题中的。有关如何编写适当的动态库的详细信息

使用adb安装Ink apk时出现相同错误。使用ndk-r9d。你说的是“bug”。可以忽略吗?还是这是一个真正的问题?谢谢。@Chris Stratton我收到了同样的警告,我正在使用android-ndk-r10e。难道这个bug不可能指向lib.so中的错误吗。例如,不释放动态内存或其他东西这个答案非常古老,现在对于NDK的任何现代版本都是不正确的。有关更可能的解决方案,请参见下面的答案。@假设问题的关键是,这是由于使用了旧版本的NDK,并带有不幸的默认行为造成的。请注意问题中明确提到的Android 4.4。你的回答不适用于实际提出的问题,尽管它可能对其他情况下的相关情况有用。另请参阅注意事项,注意不要将系统库上的警告误认为是apk中实际提供的库上的警告。如果您只在应用程序中使用Java并获得警告,该怎么办?问题的解决与此问题的问题无关。此问题询问有关此警告的修复方法。我收到了同样的警告,一个不匹配的修复程序解决了这个问题。也许您没有本机不匹配,但它可能会帮助其他存在不匹配的人得到警告…您必须确保为您编译的arch类型使用正确的开关。此外,您还可以在.a或.so上使用
objdump
,查看它们是否有文本重定位。它们本身可能也会链接到具有重定位的库。您还应该通过构建脚本跟踪
LOCALC_标志
(或该变量的名称),以查看它是否传递到相关库。谢谢。有一件事。如上所述,这应该是一个“bug”。可以忽略吗?或者这是一个真正的问题?它可能是一个bug,这取决于编译的ndk版本。因此,它看起来在2012年得到了修复。如果您正在编写正在编译的库,并且它正在生成此警告,则应该修复它。对于安卓棉花糖,具有文本重新定位的库不会产生警告;它们将产生错误,您的应用程序将在启动时崩溃。@Clavicle。我已经解决了这个问题。在Android中,L文本重定位是一个警告,但在Android M中是一个错误。在使用u提到的标志后,在驱动程序代码中修复了该错误