<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    ldd 查看程序/動態庫 的依賴

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    今天在幫同事查看一個問題時, 需要用到ldd, 于是就順便看了一下ldd的實現. 好在ldd本身只是一個腳本, 而不是executable, 可以直接查看實現的代碼.

    根據注釋:

     21 # This is the `ldd' command, which lists what shared libraries are
     22 # used by given dynamically-linked executables.  It works by invoking the
     23 # run-time dynamic linker as a command and setting the environment
     24 # variable LD_TRACE_LOADED_OBJECTS to a non-empty value.


    LDD只是設置了LD_TRACE_LOADED_OBJECTS后, 再運行程序或調用/lib/ld-linux.so.2(或/lib64/ld-linux-x86-64.so.2或其他, 取決于系統的architecture等等)來處理動態庫, 再將輸出分析從而得到整個依賴關系.


    于是對于正常的exectuable(以a.out為例)而言, 另一種獲得依賴關系列表的方式為:

    export LD_TRACE_LOADED_OBJECTS=1
    ./a.out
    輸出的結果為:

    1. linux-gate.so.1 => (0xb78b5000)
    2. librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb78a4000)
    3. libselinux.so.1 => /lib/libselinux.so.1 (0xb7889000)
    4. libacl.so.1 => /lib/libacl.so.1 (0xb7880000)
    5. libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7726000)
    6. libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb770d000)
    7. /lib/ld-linux.so.2 (0xb78b6000)
    8. libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7709000)
    9. libattr.so.1 => /lib/libattr.so.1 (0xb7703000)


    而對于.so(假設有個liba.so)而言, 另一種獲得依賴關系的方式為:
    export LD_TRACE_LOADED_OBJECTS=1
    /lib/ld-linux.so.2 ./liba.so
    輸出結果為:

    1. linux-gate.so.1 => (0xb777e000)
    2. libdb-4.8.so => /home/db/opt/dbxml/install/lib/libdb-4.8.so (0xb7360000)
    3. libxqilla.so.5 => /home/db/opt/dbxml/install/lib/libxqilla.so.5 (0xb6f10000)
    4. libxerces-c-3.0.so => /home/db/opt/dbxml/install/lib/libxerces-c-3.0.so (0xb6b6c000)
    5. libz.so.1 => /lib/libz.so.1 (0xb6b51000)
    6. libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6a5b000)
    7. libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb6a35000)
    8. libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb68db000)
    9. libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68bb000)
    10. libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb68a2000)
    11. libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb688b000)
    12. /lib/ld-linux.so.2 (0xb777f000)

    運行中發現貌似/lib/ld-linux.so.2后面的參數是需要帶絕對路徑或者相對路徑的(當前目錄則需要用./作為前綴), 目前還不知道ld-linux.so.2是如何確定參數路徑的. 當然, 實際上executable也可以用/lib/ld-linux.so.2來獲得依賴列表.

    實際上/lib/ld-linux.so.2是用來運行程序的. 當執行一個動態鏈接的程序時, 該工具被自動調用用來獲得并解析程序的依賴關系而后執行程序本身. 關于/lib/ld-linux.so.2命令的詳情, 參見 http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全