2014-02-21 32 views
2

當我編寫代碼安裝在目標機器上時,我想知道依賴關係,並注意到沒有需要的openssl庫。我不知道,因爲我知道我使用OpenSSL:哪個庫是MD5()函數?

#include <openssl/md5.h> 

... 
MD5(a, b, c); 
... 

出乎我的意料,看來我們只有對libc的鏈接。 MD5是否真的在libc中實現,而不是在某些libssl庫中實現?


objdump的給我講述了鏈接庫中的信息:

Dynamic Section: 
    NEEDED    libQtCore.so.4 
    NEEDED    libstdc++.so.6 
    NEEDED    libgcc_s.so.1 
    NEEDED    libc.so.6 
    SONAME    libcontent.so 

至於建議由noloader我試着用LDD,仍然看不到庫,將使意義MD5。 libcontent.so直接使用MD5()...

ldd ../BUILD/snapwebsites/plugins/content/libcontent.so 
    linux-vdso.so.1 => (0x00007fff4f3ff000) 
    libQtCore.so.4 => /usr/lib/x86_64-linux-gnu/libQtCore.so.4 (0x00007ff37ad0f000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff37aa0c000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff37a7f5000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff37a42c000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff37a20f000) 
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff379ff7000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff379df3000) 
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007ff379af7000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff3798ee000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff3795e9000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007ff37b5e5000) 
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007ff3793a9000) 

而且,只是爲了確保,我想對內容庫nm和我能看到MD5項:

    w _ITM_registerTMCloneTable 
00000000003c9468 d __JCR_END__ 
00000000003c9468 d __JCR_LIST__ 
       w _Jv_RegisterClasses 
       U MD5      <---- it's here... 
       U [email protected]@GLIBC_2.2.5 
       w pthread_cancel 
       U [email protected]@GLIBC_2.2.5 
+0

你怎麼知道這個二進制文件只是針對libc的聯繫? – delnan

+0

你會使用MD5做什麼? – ErstwhileIII

+0

@delnan,我使用objdump -x的輸出進行了更新。 –

回答

2

哪個庫是MD5()函數?

OpenSSL庫。鏈接到libcrypto。請參閱md5(3)


是MD5確實在libc中,而不是在一些libssl程序庫,實施?

那麼,它不是在Ubuntu的libc

$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep -i md5 
$ 

而且這是在OpenSSL的libcrypto

$ nm -D /usr/lib/x86_64-linux-gnu/libcrypto.so | grep MD5 
0000000000066840 T MD5 
0000000000066640 T MD5_Final 
0000000000066790 T MD5_Init 
0000000000066630 T MD5_Transform 
0000000000066420 T MD5_Update 

T意味着符號(MD5)的文本部分被定義其出口。 A t表示該符號在TEXT部分中定義,,但其未導出,因此您無法鏈接它(請考慮GCC的visibility=private或靜態聲明)。

如果您得到U,那麼這意味着該符號是必需的但未定義,並且庫必須提供該符號。


#include <openssl/md5.h> 

... 
MD5(a, b, c, d); 

MD5(a, b, c, d);不是OpenSSL的MD5。 OpenSSL的MD5有三個參數,而不是四個。


objdump的給我講述了鏈接庫

ldd可能會給你不同的結果的信息。它是我用它來檢查依賴(我不使用objdump):

$ cat t.c 
#include <openssl/md5.h> 

int main(int argc, char* argv[]) 
{ 
    const char password[] = "password"; 
    char hash[MD5_DIGEST_LENGTH];  
    MD5(password, sizeof(password), hash); 

    return 0; 
} 

$ gcc t.c -o t.exe -lcrypto 
$ ldd t.exe 
    linux-vdso.so.1 => (0x00007fff435ff000) 
    libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fbaff01b000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbafec90000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbafea8b000) 
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fbafe874000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fbaff429000) 

而且t.exe的未解決的符號:

$ nm t.exe | grep MD5 
    U [email protected]@OPENSSL_1.0.0 
+0

我仍然在依賴列表中看不到libcrypto。難道是因爲這是一個.so,它會在運行時解決它,如果主進程與libcrypto鏈接,那麼它將一切正常嗎? (我剛剛檢查過,主應用程序與libcrypto.so鏈接,所以這就是答案!你認爲如何?) –

+0

'U MD5'中的'U'表示符號未定義,庫必須提供它。嘗試轉儲'libQtCore'('nm -D')來查看'libQtCore'是否提供了它;或嘗試拋棄'libQtCore'的依賴關係來查看'libQtCore'是否與OpenSSL的'libcrypto.so'鏈接。 – jww

+0

請注意,我使用ldopen()加載.so。我查看了所有與那個.so鏈接的庫,並且其中沒有'libcrypto.so'文件。但是,它在主應用程序中。使用ldopen()的懶鏈接模式,我認爲它能夠從主應用程序的鏈接庫中找到該庫...我想沒關係,只是這不是我所說的安全(因爲該庫可能是從主應用程序中刪除,然後延遲加載工作,但如果我調用該函數,它將會失敗,說它不能在執行時解析該符號。) –