`找不到-lmalloc`,错误:ld返回1退出状态

时间:2013-09-29 20:07:04

标签: c gcc compiler-errors malloc

目前正在尝试使用编译此程序 g++ -o crack crack2.c -lcrypt -lpthread -lmalloc我正在接受:

z@ubuntu:~/Desktop$ g++ -o crack crack2.c -lcrypt -lpthread -lmalloc

/usr/bin/ld: cannot find -lmalloc

collect2: error: ld returned 1 exit status

所以..如果我删除-lmalloc,我会undefined reference to 'passwordLooper(void*)'

真的不确定如何解决这个问题。它必须是与malloc或-lmalloc相关的东西,因为在我使用malloc()之前,一切都按预期工作并且编译了程序。

/*
crack.exe
*/
/*  g++ -o crack crack.c -lcrypt -lpthread -lmalloc */
//define _GNU_SOURCE
#include <malloc.h>

#include <crypt.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <string.h>
#include <math.h>



void *passwordLooper(void *passwordData);
//void *threadFunction(void *threads);
typedef struct{
    int keysize;
    char *target;
    char *salt;
}passwordData;

int main(int argc, char *argv[]){           /* usage = crack threads keysize target */
    int i = 0;
    /*  arg[0] = crack, arg[1] = #of threads arg[2] = size of password, arg[3] = hashed password being cracked */

    if (argc !=  4) {
        fprintf(stderr, "Too few/many arguements give.\n");
        fprintf(stderr, "Proper usage: ./crack threads keysize target\n");
        exit(0);
    }

    int threads = *argv[1]-'0';         // threads is now equal to the second command line argument number
    int keysize = *argv[2]-'0';         // keysize is now equal to the third command line argument number
    char target[9]; 
    strcpy(target, argv[3]);
    char salt[10];

    while ( i < 2 ){            //Takes first two characters of the hashed password and assigns them to the salt variable
        salt[i] = target[i];
        i++;
    }


    printf("threads = %d\n", threads);      /*used for testing */
    printf("keysize = %d\n", keysize);
    printf("target = %s\n", target);        
    printf("salt = %s\n", salt);        


    if (threads < 1 || threads > 8){
        fprintf(stderr, "0 < threads <= 8\n");
        exit(0);
    }                                               /*Checks to be sure that threads and keysize are*/
    if (keysize < 1 || keysize > 8){                                                /*of the correct size   */
        fprintf(stderr, "0 < keysize <= 8\n");
        exit(0);
    }

    pthread_t t1,t2,t3,t4,t5,t6,t7,t8;

    struct crypt_data data;
    data.initialized = 0;
    //~ passwordData.keysize = keysize;
    //~ passwordData.target = target;
    //~ passwordData.salt = salt;

    passwordData *pwd = (passwordData *) malloc(sizeof(pwd));
    pwd->keysize = keysize;
    pwd->target = target;
    pwd->salt = salt;


    //~ if ( threads = 1 ){
        //~ pthread_create(&t1, NULL, *threadFunction, threads);
    //~ }


    char unSalted[30];
    int j = 0;
    for (i = 2; target[i] != '\0'; i++){        /*generates variable from target that does not include salt*/
        unSalted[j] = target[i];
        j++;
    }
    printf("unSalted = %s\n", unSalted); //unSalted is the variable target without the first two characters (the salt)

    char password[9] = {0};
    passwordLooper(pwd);


}




/*_____________________________________________________________________________________________________________*/
/*_____________________________________________________________________________________________________________*/
void *passwordLooper(passwordData *pwd){
    char password[9] = {0};
    int result;

    int ks = pwd->keysize;
    char *target = pwd->target;
    char *s = pwd->salt;

    for (;;){
        int level = 0; 
        while (level < ks && strcmp( crypt(password, s), target ) != 0) {
            if (password[level] == 0){
                password[level] = 'a';
                break;
            }
            if (password[level] >= 'a' && password[level] < 'z'){
                password[level]++;
                break;
            }
            if (password[level] == 'z'){
                password[level] = 'a';
                level++;
            }
        }

        char *cryptPW = crypt(password, s);
        result = strcmp(cryptPW, target);

        if (result == 0){               //if result is zero, cryptPW and target are the same
            printf("result = %d\n", result);
            printf ("Password found: %s\n", password);
            printf("Hashed version of password is %s\n", cryptPW);
            break;  
        }
        if (level >= ks){           //if level ends up bigger than the keysize, break, no longer checking for passwords
            printf("Password not found\n");
            break;
        }
    }
    exit(0);
}

1 个答案:

答案 0 :(得分:2)

你的代码似乎是纯粹的C.你应该用gcc编译它,而不是g ++。

malloc函数在<stdlib.h>中声明,并在标准C库中实现。您不需要#include <malloc.h>-lmalloc

您的passwordLooper函数有两个不一致的声明。你的“前瞻性声明”:

void *passwordLooper(void *passwordData);

与定义不符:

void *passwordLooper(passwordData *pwd){
    /* ... */
}

passwordLooper的“前向声明”需要遵循passwordData类型的定义。

你有这一行:

//define _GNU_SOURCE

您需要取消注释:

#define _GNU_SOURCE

使struct crypt_data类型可见。

当我进行所有这些更改时,我能够编译它(至少在我的系统上):

gcc c.c -o c -lcrypt