h导致我的pam模块失败。c程序设计

h导致我的pam模块失败。c程序设计,c,linux,hash,md5,pam,C,Linux,Hash,Md5,Pam,我已经用c编写了一个pam模块,下面的代码导致我的pam将其输出 sudo:pam\u身份验证:模块未知 我正在尝试获取字符串的md5哈希值 char *str2md5(const char *str, int length) { int n; MD5_CTX c; unsigned char digest[16]; char *out = (char*)malloc(33); MD5_Init(&c); while (length &

我已经用c编写了一个pam模块,下面的代码导致我的pam将其输出

sudo:pam\u身份验证:模块未知

我正在尝试获取字符串的md5哈希值

char *str2md5(const char *str, int length) {
    int n;
    MD5_CTX c;
    unsigned char digest[16];
    char *out = (char*)malloc(33);

    MD5_Init(&c);

    while (length > 0) {
        if (length > 512) {
            MD5_Update(&c, str, 512);
        } else {
            MD5_Update(&c, str, length);
        }
        length -= 512;
        str += 512;
    }

    MD5_Final(digest, &c);

    for (n = 0; n < 16; ++n) {
        snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
    }

    return out;
} 

尽管我为什么在使用pam时尝试获取md5散列值是微不足道的,但我正在做一些事情,出于某些原因pam不喜欢。有人知道解决方法吗?

很可能是您创建了一个缺少符号的共享对象。链接共享库时,链接器不会抱怨未解析的符号,因为这些符号可能合法地不存在。加载库时,使用已加载的符号解析剩余符号。如果仍然缺少符号,则中止加载共享库。这是您从PAM看到的错误的合理原因


#include
指令告诉编译器特定符号的类型,但不告诉编译器在哪里找到相应的对象。除了告诉编译器这些函数确实存在外,还需要告诉链接器在哪里可以找到它们。如果您使用的是gcc,那么在您的链接器调用中可能会缺少类似于
-lssl
的内容。

如何将md5函数链接到您的模块?#include/?
pkg config openssl--libs
就是您想要的。
char *str2md5(const char *str, int length) {
    int n;
    MD5_CTX c;
    /*unsigned char digest[16];
    char *out = (char*)malloc(33);

    MD5_Init(&c);

    while (length > 0) {
        if (length > 512) {
            MD5_Update(&c, str, 512);
        } else {
            MD5_Update(&c, str, length);
        }
        length -= 512;
        str += 512;
    }

    MD5_Final(digest, &c);

    for (n = 0; n < 16; ++n) {
        snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
    }

    return out;*/
}
DEBUG: 08217239
Authentication Code: 08217239
[sudo] password for richardw: