当我编写代码以在目标机器上安装时,我想知道依赖关系,并注意到不需要openssl库.我想知道因为我知道我在使用OpenSSL:
#include <openssl/md5.h>
...
MD5(a, b, c);
...
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,似乎我们只能与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
Run Code Online (Sandbox Code Playgroud)
正如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)
Run Code Online (Sandbox Code Playgroud)
另外,为了确保,我在该内容库上尝试了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
Run Code Online (Sandbox Code Playgroud)
MD5() 函数在哪个库中?
OpenSSL 库。链接到libcrypto. 见md5(3)。
MD5 真的是在 libc 中实现的,而不是在某些 libssl 库中实现的吗?
好吧,它不在 Ubuntu 中libc:
$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep -i md5
$
Run Code Online (Sandbox Code Playgroud)
它在 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
Run Code Online (Sandbox Code Playgroud)
这T意味着符号 ( MD5) 在 TEXT 部分中定义并导出。At表示符号在 TEXT 部分中定义,但未导出,因此您无法链接它(想想 GCCvisibility=private或静态声明)。
如果您得到 a U,则意味着该符号是必需的但未定义,并且必须由库提供它。
Run Code Online (Sandbox Code Playgroud)#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)
Run Code Online (Sandbox Code Playgroud)
Andt.exe的未解析符号:
$ nm t.exe | grep MD5
U MD5@@OPENSSL_1.0.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22135 次 |
| 最近记录: |