Skip to main content
 首页 » 编程设计

android-ndk之未使用的DT条目:类型为0x1d arg

2024年09月07日20myhome

我正在使用android NDK- r10d 来构建可在adb shell上运行的Android x86可执行文件(共享链接)。在运行时,我收到以下警告:
WARNING: linker: ./myapp: **unused DT entry:** type 0x1d arg 0x4a604
我正在使用植根的Nexus Player测试可执行文件。

我的构建机器是Ubuntu 14.04(也在Fedora 14机器上尝试过)。

请您参考如下方法:

什么是“未使用的DT条目”错误?

如果您已到达此页面,则可能是因为您有
编译或尝试在基于ARM的Android上运行某些二进制文件
系统,导致您的二进制文件/应用程序崩溃或生成一个
您的logcat中有很多警告。通常是这样的:

WARNING: linker: /blahblah/libopenssl.so: unused DT entry: type 0x6ffffffe arg 0x1188 

问:什么是“DT条目”?

简而言之,它们是文件中的描述性数组条目
ELF文件的结构。具体来说,它们被称为
Dynamic Array Tags ,它们是可执行文件和
共享对象。但是,并非所有条目都是必需的或可用的,
取决于处理器和内核体系结构。

在我们的案例中,我们面临一个“警告”,其中之一是“未使用”的。
这意味着您的可执行文件或库( *.so)文件已经被
使用指示的 DT 条目进行编译,但是您的内核不支持
该条目,出于各种原因。最好的例子可以在基于ARM的系统上找到
Android系统,其中系统库路径是固定的,并且
用于固件(OS /内核)的交叉编译器设置为不使用
这些条目。通常,二进制文件仍然可以正常运行,但是内核
每次使用时都会标记此警告。

问:什么时候发生?

在以下情况下可能会发生这种情况:
  • 您的ARM内核使用错误的标志进行了交叉编译(通常用于其他处理器体系结构)。
  • 您可以使用AOS弃用的编译标志交叉编译ARM二进制文件和库。
  • 和可能还有其他尚未发现的方法..

  • Starting from 5.1 (API 22) the Android linker warns about the VERNEED and VERNEEDNUM ELF dynamic sections.



    在Android设备上导致此错误的最常见标志是:
    DT_RPATH        0x0f (15)       The DT_STRTAB string table offset of a null-terminated library search path string.  
                                    This element's use has been superseded by DT_RUNPATH. 
    DT_RUNPATH      0x1d (29)       The DT_STRTAB string table offset of a null-terminated library search path string. 
    DT_VERNEED      0x6ffffffe      The address of the version dependency table. Elements within this table contain  
                                    indexes into the string table DT_STRTAB. This element requires that the  
                                    DT_VERNEEDNUM element also be present. 
    DT_VERNEEDNUM   0x6fffffff      The number of entries in the DT_VERNEEDNUM table. 
    

    跟踪上面的错误,我们发现此消息来自 bioniclinker.cpp:

      case DT_VERNEED: 
        verneed_ptr_ = load_bias + d->d_un.d_ptr; 
        break; 
     
      case DT_VERNEEDNUM: 
        verneed_cnt_ = d->d_un.d_val; 
        break; 
     
      case DT_RUNPATH: 
        // this is parsed after we have strtab initialized (see below). 
        break; 
     
      default: 
        if (!relocating_linker) { 
          DL_WARN("\"%s\" unused DT entry: type %p arg %p", get_realpath(), 
              reinterpret_cast<void*>(d->d_tag), reinterpret_cast<void*>(d->d_un.d_val)); 
        } 
        break; 
    } 
    

    支持此 symbol versioning的代码(上述)已提交给 April 9, 2015。因此,如果您的NDK构建被设置为支持早于此的API,或者使用链接到此早期库的构建工具,则会收到这些警告。

    问:如何查找系统或二进制文件正在使用的DT条目?

    有很多方法可以做到这一点:
  • 您可以在内核源代码中查找<linux/elf.h>
  • 您在Android NDK安装文件夹中查找并检查:

  • # To find all elf.h files: 
    find /<path_to>/ndk/platforms/android-*/arch-arm*/usr/include/linux/ -iname "elf.h" 
    
  • 对二进制文件执行readelf:

  • $ readelf --dynamic libopenssl.so 
     
     Dynamic section at offset 0x23b960 contains 28 entries: 
     Tag        Type                         Name/Value 
     0x00000003 (PLTGOT)                     0x23ce18 
     0x00000002 (PLTRELSZ)                   952 (bytes) 
     0x00000017 (JMPREL)                     0x15e70 
     0x00000014 (PLTREL)                     REL 
     0x00000011 (REL)                        0x11c8 
     0x00000012 (RELSZ)                      85160 (bytes) 
     0x00000013 (RELENT)                     8 (bytes) 
     0x6ffffffa (RELCOUNT)                   10632 
     0x00000015 (DEBUG)                      0x0 
     0x00000006 (SYMTAB)                     0x148 
     0x0000000b (SYMENT)                     16 (bytes) 
     0x00000005 (STRTAB)                     0x918 
     0x0000000a (STRSZ)                      1011 (bytes) 
     0x00000004 (HASH)                       0xd0c 
     0x00000001 (NEEDED)                     Shared library: [libdl.so] 
     0x00000001 (NEEDED)                     Shared library: [libc.so] 
     0x0000001a (FINI_ARRAY)                 0x238458 
     0x0000001c (FINI_ARRAYSZ)               8 (bytes) 
     0x00000019 (INIT_ARRAY)                 0x238460 
     0x0000001b (INIT_ARRAYSZ)               16 (bytes) 
     0x00000020 (PREINIT_ARRAY)              0x238470 
     0x00000021 (PREINIT_ARRAYSZ)            0x8 
     0x0000001e (FLAGS)                      BIND_NOW 
     0x6ffffffb (FLAGS_1)                    Flags: NOW 
     0x6ffffff0 (VERSYM)                     0x108c 
     0x6ffffffe (VERNEED)                    0x1188 
     0x6fffffff (VERNEEDNUM)                 2 
     0x00000000 (NULL)                       0x0 
    

    从上面的错误中可以看出, type对应于 DT_VERNEED

    THIS文件:

    DT_RPATH

    This element holds the string table offset of a null-terminated search library search path string, discussed in "Shared Object Dependencies." The offset is an index into the table recorded in the DT_STRTAB entry. DT_RPATH may give a string that holds a list of directories, separated by colons (:). All LD_LIBRARY_PATH directories are searched after those from DT_RPATH.



    问:那么您如何解决或处理这些问题?

    基本上有3种方法可以解决此问题:
  • 快速
  • 不好的
  • 丑陋的


  • 快速(您没有任何来源,或者就无法打扰)

    使用“ELF清除程序”从所有二进制文件中删除有问题的DT条目。这是一种简便快捷的补救方法,尤其是当您没有针对系统正确重新编译它们的源代码时。至少有 two cleaners可以使用。

    错误的(您有资料来源)

    这是正确的方法,因为在使它工作的过程中,您将成为糟糕的ARM交叉编译器专家。基本上,您需要在使用的Makefile中找到并调整编译器设置。

    here:

    The Android linker (/system/bin/linker) does not support RPATH or RUNPATH, so we set LD_LIBRARY_PATH=$USR/lib and try to avoid building useless rpath entries with --disable-rpath configure flags. Another option to avoid depending on LD_LIBRARY_PATH would be supplying a custom linker - this is not done due to the overhead of maintaining a custom linker.



    丑陋的(您只希望您的应用程序可以处理任何脏二进制文件。)

    您告诉Java应用程序在检查null时不要害怕
    在错误处理程序中,而是可能会收到这些警告
    导致致命的异常。使用类似:

    class OpensslErrorThread extends Thread { 
        @Override 
        public void run() { 
            try { 
                while(true){ 
                    String line = opensslStderr.readLine(); 
                    if(line == null){ 
                        // OK 
                        return; 
                    } 
                    if(line.contains("unused DT entry")){ 
                        Log.i(TAG, "Ignoring \"unused DT entry\" error from openssl: " + line); 
                    } else { 
                        // throw exception! 
                        break; 
                    } 
                } 
            } catch(Exception e) { 
                Log.e(TAG, "Exception!") 
            } 
        } 
    } 
    

    这是非常糟糕且丑陋的,因为它在膨胀代码时无法解决任何问题。另外,出现警告是有原因的,那就是在将来的AOS版本中,这将成为一个完整的错误!

    问:还有什么?

    API在18-25(J到N)之间进行了许多更改
    Android内核和库的编译方式。我不能
    提供所有这些的近距离解释,但是也许这
    将有助于指导您正确的方向。最好的来源是
    当然可以查看Android资源和文档本身。

    例如, HEREHERE

    最后是完整列表:
    Name                    Value           d_un            Executable              Shared Object 
    --------------------------------------------------------------------------------------------- 
    DT_NULL                 0               Ignored         Mandatory               Mandatory 
    DT_NEEDED               1               d_val           Optional                Optional 
    DT_PLTRELSZ             2               d_val           Optional                Optional 
    DT_PLTGOT               3               d_ptr           Optional                Optional 
    DT_HASH                 4               d_ptr           Mandatory               Mandatory 
    DT_STRTAB               5               d_ptr           Mandatory               Mandatory 
    DT_SYMTAB               6               d_ptr           Mandatory               Mandatory 
    DT_RELA                 7               d_ptr           Mandatory               Optional 
    DT_RELASZ               8               d_val           Mandatory               Optional 
    DT_RELAENT              9               d_val           Mandatory               Optional 
    DT_STRSZ                0x0a (10)       d_val           Mandatory               Mandatory 
    DT_SYMENT               0x0b (11)       d_val           Mandatory               Mandatory 
    DT_INIT                 0x0c (12)       d_ptr           Optional                Optional 
    DT_FINI                 0x0d (13)       d_ptr           Optional                Optional 
    DT_SONAME               0x0e (14)       d_val           Ignored                 Optional 
    DT_RPATH                0x0f (15)       d_val           Optional                Optional 
    DT_SYMBOLIC             0x10 (16)       Ignored         Ignored                 Optional 
    DT_REL                  0x11 (17)       d_ptr           Mandatory               Optional 
    DT_RELSZ                0x12 (18)       d_val           Mandatory               Optional 
    DT_RELENT               0x13 (19)       d_val           Mandatory               Optional 
    DT_PLTREL               0x14 (20)       d_val           Optional                Optional 
    DT_DEBUG                0x15 (21)       d_ptr           Optional                Ignored 
    DT_TEXTREL              0x16 (22)       Ignored         Optional                Optional 
    DT_JMPREL               0x17 (23)       d_ptr           Optional                Optional 
    DT_BIND_NOW             0x18 (24)       Ignored         Optional                Optional 
    DT_INIT_ARRAY           0x19 (25)       d_ptr           Optional                Optional 
    DT_FINI_ARRAY           0x1a (26)       d_ptr           Optional                Optional 
    DT_INIT_ARRAYSZ         0x1b (27)       d_val           Optional                Optional 
    DT_FINI_ARRAYSZ         0x1c (28)       d_val           Optional                Optional 
    DT_RUNPATH              0x1d (29)       d_val           Optional                Optional 
    DT_FLAGS                0x1e (30)       d_val           Optional                Optional 
    DT_ENCODING             0x1f (32)       Unspecified     Unspecified             Unspecified 
    DT_PREINIT_ARRAY        0x20 (32)       d_ptr           Optional                Ignored 
    DT_PREINIT_ARRAYSZ      0x21 (33)       d_val           Optional                Ignored 
    DT_MAXPOSTAGS           0x22 (34)       Unspecified     Unspecified             Unspecified 
    DT_LOOS                 0x6000000d      Unspecified     Unspecified             Unspecified 
    DT_SUNW_AUXILIARY       0x6000000d      d_ptr           Unspecified             Optional 
    DT_SUNW_RTLDINF         0x6000000e      d_ptr           Optional                Optional 
    DT_SUNW_FILTER          0x6000000e      d_ptr           Unspecified             Optional 
    DT_SUNW_CAP             0x60000010      d_ptr           Optional                Optional 
    DT_SUNW_SYMTAB          0x60000011      d_ptr           Optional                Optional 
    DT_SUNW_SYMSZ           0x60000012      d_val           Optional                Optional 
    DT_SUNW_ENCODING        0x60000013      Unspecified     Unspecified             Unspecified 
    DT_SUNW_SORTENT         0x60000013      d_val           Optional                Optional 
    DT_SUNW_SYMSORT         0x60000014      d_ptr           Optional                Optional 
    DT_SUNW_SYMSORTSZ       0x60000015      d_val           Optional                Optional 
    DT_SUNW_TLSSORT         0x60000016      d_ptr           Optional                Optional 
    DT_SUNW_TLSSORTSZ       0x60000017      d_val           Optional                Optional 
    DT_SUNW_CAPINFO         0x60000018      d_ptr           Optional                Optional 
    DT_SUNW_STRPAD          0x60000019      d_val           Optional                Optional 
    DT_SUNW_CAPCHAIN        0x6000001a      d_ptr           Optional                Optional 
    DT_SUNW_LDMACH          0x6000001b      d_val           Optional                Optional 
    DT_SUNW_CAPCHAINENT     0x6000001d      d_val           Optional                Optional 
    DT_SUNW_CAPCHAINSZ      0x6000001f      d_val           Optional                Optional 
    DT_HIOS                 0x6ffff000      Unspecified     Unspecified             Unspecified 
    DT_VALRNGLO             0x6ffffd00      Unspecified     Unspecified             Unspecified 
    DT_CHECKSUM             0x6ffffdf8      d_val           Optional                Optional 
    DT_PLTPADSZ             0x6ffffdf9      d_val           Optional                Optional 
    DT_MOVEENT              0x6ffffdfa      d_val           Optional                Optional 
    DT_MOVESZ               0x6ffffdfb      d_val           Optional                Optional 
    DT_POSFLAG_1            0x6ffffdfd      d_val           Optional                Optional 
    DT_SYMINSZ              0x6ffffdfe      d_val           Optional                Optional 
    DT_SYMINENT             0x6ffffdff      d_val           Optional                Optional 
    DT_VALRNGHI             0x6ffffdff      Unspecified     Unspecified             Unspecified 
    DT_ADDRRNGLO            0x6ffffe00      Unspecified     Unspecified             Unspecified 
    DT_CONFIG               0x6ffffefa      d_ptr           Optional                Optional 
    DT_DEPAUDIT             0x6ffffefb      d_ptr           Optional                Optional 
    DT_AUDIT                0x6ffffefc      d_ptr           Optional                Optional 
    DT_PLTPAD               0x6ffffefd      d_ptr           Optional                Optional 
    DT_MOVETAB              0x6ffffefe      d_ptr           Optional                Optional 
    DT_SYMINFO              0x6ffffeff      d_ptr           Optional                Optional 
    DT_ADDRRNGHI            0x6ffffeff      Unspecified     Unspecified             Unspecified 
    DT_RELACOUNT            0x6ffffff9      d_val           Optional                Optional 
    DT_RELCOUNT             0x6ffffffa      d_val           Optional                Optional 
    DT_FLAGS_1              0x6ffffffb      d_val           Optional                Optional 
    DT_VERDEF               0x6ffffffc      d_ptr           Optional                Optional 
    DT_VERDEFNUM            0x6ffffffd      d_val           Optional                Optional 
    DT_VERNEED              0x6ffffffe      d_ptr           Optional                Optional 
    DT_VERNEEDNUM           0x6fffffff      d_val           Optional                Optional 
    DT_LOPROC               0x70000000      Unspecified     Unspecified             Unspecified 
    DT_SPARC_REGISTER       0x70000001      d_val           Optional                Optional 
    DT_AUXILIARY            0x7ffffffd      d_val           Unspecified             Optional 
    DT_USED                 0x7ffffffe      d_val           Optional                Optional 
    DT_FILTER               0x7fffffff      d_val           Unspecified             Optional 
    DT_HIPROC               0x7fffffff      Unspecified     Unspecified             Unspecified