7

I had a correctly working md5 program compiled on my mac but when I try to compile on my ubuntu distro it errors out saying:

 /tmp/ccKBJiV3.o: In function `str2md5':
 md5.c:(.text+0x33): undefined reference to `MD5_Init'
 md5.c:(.text+0x5b): undefined reference to `MD5_Update'
 md5.c:(.text+0x79): undefined reference to `MD5_Update'
 md5.c:(.text+0xa2): undefined reference to `MD5_Final'
 collect2: ld returned 1 exit status

Below is my code for main:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "md5.h"
#include <openssl/md5.h>
#include <openssl/hmac.h>

int main(int argc, char *argv[]) 
{
char *output = str2md5(argv[1], strlen(argv[1]));
printf("%s\n", output);
free(output);
return 0;
}

Here is my "md5.h" file just contains the str2md5 function:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(__APPLE__)
#  define COMMON_DIGEST_FOR_OPENSSL
#  include <CommonCrypto/CommonDigest.h>
#  define SHA1 CC_SHA1
#else
#  include <openssl/md5.h>
#endif

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;
} 

I have tried to compile it with all the -l things I have found on the internet. For example:

 gcc -Wall -lcrypto -lssl md5.c -o md5

Any help to get this to work would be amazing!

Bryce
  • 447
  • 2
  • 9
  • 24
  • Thats your md5.h *header* ?? mmmk. – WhozCraig Jan 12 '13 at 17:42
  • @WhozCraig what does that mean? Am I doing completely wrong? – Bryce Jan 12 '13 at 17:50
  • It was just odd to see a function *definition* in your header, a place normally used for *declarations*, especially without an `inline` preamble. It will work as you have it, since it is only included in a single source file, but as soon as you pull that into additional source files of your module (if you ever add more than one .c file that includes your md5.h header) you'll get duplicate symbol errors from your linker. – WhozCraig Jan 12 '13 at 17:53
  • @WhozCraig ahhh okay. I understand what you mean. I am curious though where would you stick your definitions at? I am still learning and would love the advice. – Bryce Jan 13 '13 at 01:54

5 Answers5

21

OS X uses an ancient version of the GNU toolchain, whereas Ubuntu (and Linux distros in general) uses a newer one. These more recent versions require that the object and library files be specified in the order their symbols depend on each other. It means that for maximum portability, you should always put the library linker flags to the end of the command line invocation, like this:

gcc -Wall md5.c -o md5 -lcrypto -lssl
8

Put -l at the end of your command:

gcc -Wall md5.c -o md5 -lcrypto -lssl
Anton Kovalenko
  • 20,999
  • 2
  • 37
  • 69
0

To do this in eclipse:

Right Click Project in Eclipse-> C/C++ Build Settings -> Tool Settings -> GCC C Linker -> Libraries and then add "ssl" and "crypto" in the -l section on the right.

Eclipse

stanri
  • 2,922
  • 3
  • 25
  • 43
0

on ubuntu 16.04 i was having issues then i compiled it on 14.04 and it worked for me

Mansur Ul Hasan
  • 2,898
  • 27
  • 24
-1

Sometimes, proper symbolic link may be needed:

My initial system file:

-rwxr-xr-x. 1 root root 1408384 Jun  5  2014 libcrypto.so.0.9.8e
lrwxrwxrwx. 1 root root      19 Sep 22  2015 libcrypto.so.10 ->     libcrypto.so.1.0.1e
-rwxr-xr-x. 1 root root 1965856 Jul 23  2015 libcrypto.so.1.0.1e
lrwxrwxrwx. 1 root root      19 Sep 22  2015 libcrypto.so.6 ->    libcrypto.so.0.9.8e
lrwxrwxrwx. 1 root root      25 Sep 25  2015 libcrypt.so -> ../../lib64/libcrypt.so.1

Only after I have added the symbolic link

sudo ln -s libcrypto.so.1.0.1e libcrypto.so

My linking started to work

Kemin Zhou
  • 6,264
  • 2
  • 48
  • 56