1. ホーム
  2. openssl

[解決済み] MD5()関数は、どのライブラリにありますか?

2022-02-16 17:10:38

質問

ターゲットマシーンにインストールするコードを書いているとき、依存関係について考えていたところ、opensslライブラリが必要ないことに気づきました。私はOpenSSLを使用していることを知っているので、不思議に思いました。

#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


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 memcmp@@GLIBC_2.2.5
                 w pthread_cancel
                 U pthread_mutex_destroy@@GLIBC_2.2.5

解決方法は?

<ブロッククオート

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 )がTEXTセクションで定義され、エクスポートされます。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はパラメータが3つで、4つではありません。


<ブロッククオート

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 MD5@@OPENSSL_1.0.0