[解決済み] MD5()関数は、どのライブラリにありますか?
質問
ターゲットマシーンにインストールするコードを書いているとき、依存関係について考えていたところ、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
関連
-
[解決済み] OpenSSLのCMAC_xxx関数を使ってAESのCMACを計算する方法は?
-
[解決済み] プロキシを使用した openssl s_client
-
[解決済み] BEGIN RSA PRIVATE KEY」と「BEGIN PRIVATE KEY」の違いについて。
-
[解決済み] 自作ソフトでよくあるエラー。"不明なコマンド: switch"
-
[解決済み] JavaでMD5ハッシュを生成するにはどうすればよいですか?
-
[解決済み] JavaでファイルのMD5チェックサムを取得する
-
[解決済み] RSA秘密鍵を使って公開鍵を生成する?
-
[解決済み] ファイルのMD5チェックサムを生成する
-
[解決済み] ファイルのMD5チェックサムを計算する
-
[解決済み】"BEGIN RSA PRIVATE KEY" と "BEGIN PRIVATE KEY" の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】OpenSSLを使用して「unable to write 'random state'」とはどういう意味ですか?
-
[解決済み] OpenSSLでファイルを復号化しようとするとBad Magic Numberエラーが発生する
-
[解決済み] OpenSSLを使用して「unable to write 'random state'」とはどういう意味ですか?
-
[解決済み] MD5()関数は、どのライブラリにありますか?
-
[解決済み] OpenSSLのCMAC_xxx関数を使ってAESのCMACを計算する方法は?
-
[解決済み] プロキシを使用した openssl s_client
-
[解決済み】"BEGIN RSA PRIVATE KEY" と "BEGIN PRIVATE KEY" の違いについて
-
[解決済み] pem 鍵を ssh-rsa 形式に変換する
-
[解決済み] OpenSSLで公開鍵を取り出すには?
-
[解決済み] BEGIN RSA PUBLIC KEY」と「BEGIN PUBLIC KEY」の2種類の公開鍵形式がありますが、どのように変換すればよいのでしょうか?