Openssl MD5()函数在哪个库中?

Openssl MD5()函数在哪个库中?,openssl,md5,Openssl,Md5,当我编写要在目标机器上安装的代码时,我想知道依赖关系,并注意到不需要openssl库。我想知道,因为我知道我正在使用OpenSSL: #include <openssl/md5.h> ... MD5(a, b, c); ... 正如noloader所建议的,我尝试使用ldd,但仍然没有看到一个对MD5有意义的库。libcontent.so直接使用MD5() 另外,为了确保,我在该内容库上尝试了nm,我可以看到MD5条目: w _ITM_reg

当我编写要在目标机器上安装的代码时,我想知道依赖关系,并注意到不需要openssl库。我想知道,因为我知道我正在使用OpenSSL:

#include <openssl/md5.h>

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

正如noloader所建议的,我尝试使用ldd,但仍然没有看到一个对MD5有意义的库。libcontent.so直接使用MD5()


另外,为了确保,我在该内容库上尝试了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
w_ITM_寄存器克隆表
0000000000 3C9468 d_uujcr_u结束__
0000000000 3C9468 d__JCR_列表__
w_Jv_注册类别
U MD5
MD5()函数在哪个库中

OpenSSL库。链接到
libcrypto
。看


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
)在文本部分定义并导出。
t
表示符号是在文本部分中定义的,但它没有导出,因此您无法链接到它(想想GCC的
visibility=private
或静态声明)

如果您得到一个
U
,则意味着该符号是必需的,但未定义,必须由库提供


t.exe
的未解析符号:

$ nm t.exe | grep MD5
    U MD5@@OPENSSL_1.0.0

你是怎么知道这个二进制文件只与libc链接的?你用MD5干什么的?@delnan,我用objdump-x的输出做了一个更新。@erstwhileii,我已经用过了。我正在为网站的CMS工作。当您上传一个文件时,我计算MD5并将其用作Cassandra数据库中的密钥(如果您愿意,ID)。它工作得很好,我只是很惊讶没有相应的.so。这只是一个库,
libcontent.so
,严格来说,它不需要链接到提供MD5()的库。但无论加载这个库的应用程序需要什么,我仍然没有在依赖项列表中看到libcrypto。这可能是因为这是一个。所以,它将在运行时解析它,如果主进程链接到libcrypto,那么它将正常工作?(我刚检查过,主应用程序链接到libcrypto.so,这就是答案!你怎么看?)MD5中的
U
表示符号未定义,库必须提供它。尝试转储
libQtCore
nm-D
),看看
libQtCore
是否提供了它;或者尝试转储
libQtCore
的依赖项,以查看
libQtCore
是否链接到OpenSSL的
libcrypto.so
。请注意,我使用ldopen()加载了它。我查看了所有与之相关的库。因此,没有一个库中包含
libcrypto.so
文件。但是,它存在于主应用程序中。使用ldopen()的延迟链接模式,我认为它能够从主应用程序的链接库中找到该库。。。我想这没关系,只是它不是我所说的安全(因为该库可以从主应用程序中删除,然后延迟加载工作,但是如果我调用该函数,它将失败,因为它无法在执行时解析符号)
$ 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
#include <openssl/md5.h>

...
MD5(a, b, c, d);
$ 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)
$ nm t.exe | grep MD5
    U MD5@@OPENSSL_1.0.0