簡體   English   中英

未使用的DT條目:類型0x1d arg

[英]unused DT entry: type 0x1d arg

我正在使用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內核使用錯誤的標志進行交叉編譯(通常用於其他處理器體系結構)。
  • 您的ARM二進制文件和庫是使用AOS棄用的編譯標志進行交叉編譯的。
  • 可能還有其他方法尚待發現..

從5.1(API 22)開始,Android鏈接器會警告VERNEED和VERNEEDNUM ELF動態部分。

在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;
}

支持此符號版本控制的代碼(上文)於20154月9日提交。 因此,如果您的NDK構建設置為支持早於此的API,或者使用鏈接到此早期庫的構建工具,您將收到這些警告。


問:如何查找系統或二進制文件使用的DT條目?

有很多方法可以做到這一點:

  1. 您查看<linux/elf.h>內核源代碼。
  2. 您查看Android NDK安裝文件夾並檢查:
# To find all elf.h files:
find /<path_to>/ndk/platforms/android-*/arch-arm*/usr/include/linux/ -iname "elf.h"
  1. 做二進制的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

文件:

DT_RPATH

此元素保存以“共享對象依賴關系”中討論的以null結尾的搜索庫搜索路徑字符串的字符串表偏移量。 偏移量是DT_STRTAB條目中記錄的表的索引。 DT_RPATH可以給出一個包含目錄列表的字符串,以冒號(:)分隔。 在DT_RPATH之后搜索所有LD_LIBRARY_PATH目錄。

問:那么你如何解決或處理這些問題呢?

基本上有3種方法可以解決這個問題:

  1. 快點
  2. 壞的
  3. 丑陋的

快速 (你沒有任何消息來源或只是不能打擾)

使用“ELF清除器”從所有二進制文件中刪除有問題的DT條目。 這是一種簡單快速的補救措施,尤其是當您沒有為您的系統正確重新編譯它們的源時。 你可以使用至少兩個清潔劑


(你有消息來源)

是正確的方法,因為你將成為一個壞的ARM交叉編譯大師在使其工作的過程中。 您基本上需要在使用的Makefile中查找和調​​整編譯器設置。

這里

Android鏈接器(/ system / bin / linker)不支持RPATH或RUNPATH,因此我們設置LD_LIBRARY_PATH = $ USR / lib並嘗試使用--disable -rpath配置標志來避免構建無用的rpath條目。 避免依賴LD_LIBRARY_PATH的另一個選擇是提供自定義鏈接器 - 由於維護自定義鏈接器的開銷,這是不可能的。


丑陋 (你只想讓你的應用程序使用任何臟二進制文件。)

你告訴你的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

使用readelf -d,您可以在二進制文件中列出DT條目:

 0x0000001d (RUNPATH)                    Library runpath: [lib]

正如您所看到的,0x1d對應於RUNPATH該條目添加了鏈接器選項-rpath(或-R,如果后跟目錄)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM