Estoy tratando de usar OpenSSL para calcular el hash sha1 del programa ac. Estoy compilando con clang en Mac OS X Yosemite con un Intel i7 (entonces 64 bits).
La pieza de código relevante es más o menos así:
#include <openssl/evp.h> ... unsigned char outHash[20]; hash("SHA1","abcd", 20, outHash); La cuestión es que, al usar la función "hash" de openssl/evp.h , al compilar con clang se produce el siguiente error:
Undefined symbols for architecture x86_64: "_hash", referenced from: _getRandomSHA1 in main-68ccd6.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)Por lo tanto, parece que el enlazador no encuentra OpenSSL (la función "hash" no está identificada). ¿Alguna idea sobre cómo solucionar este problema?
EDITAR:
Resulta que estaba tratando de usar una función que no existe ("hash"). Perdón por engañarlo al respecto.
Sin embargo, sigo teniendo el mismo problema: incluir openssl/evp.h no parece funcionar.
Esta es la función hash que estoy usando, usa evp para realizar la codificación sha1:
unsigned int hash(const char *mode, const char* dataToHash, size_t dataSize, unsigned char* outHashed) { unsigned int md_len = -1; const EVP_MD *md = EVP_get_digestbyname(mode); if(NULL != md) { EVP_MD_CTX mdctx; EVP_MD_CTX_init(&mdctx); EVP_DigestInit_ex(&mdctx, md, NULL); EVP_DigestUpdate(&mdctx, dataToHash, dataSize); EVP_DigestFinal_ex(&mdctx, outHashed, &md_len); EVP_MD_CTX_cleanup(&mdctx); } return md_len; }Y luego llamo:
hash("SHA1","abcd", 20, outHash);Estoy compilando igual que antes, este es mi comando de compilación (bastante simple):
clang main.cY recibo el siguiente error del enlazador:
Undefined symbols for architecture x86_64: "_EVP_DigestFinal_ex", referenced from: _hash in main-935849.o "_EVP_DigestInit_ex", referenced from: _hash in main-935849.o "_EVP_DigestUpdate", referenced from: _hash in main-935849.o "_EVP_MD_CTX_cleanup", referenced from: _hash in main-935849.o "_EVP_MD_CTX_init", referenced from: _hash in main-935849.o "_EVP_get_digestbyname", referenced from: _hash in main-935849.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)#include <openssl/evp.h> ... unsigned char outHash[20]; hash("SHA1","abcd", 20, outHash);
OpenSSL no tiene una int hash(...) o char* hash(...) .
$ cat /usr/include/openssl/evp.h | grep hash devuelve 0 hits. man 3 hash devuelve el "método de acceso a la base de datos hash" de BSD.
Undefined symbols for architecture x86_64: "_hash", referenced from: _getRandomSHA1 in main-68ccd6.o
Aferrándose a _getRandomSHA1 , hay una función SHA , pero está disponible desde sha.h , y no evp.h (filtré la macro DEPRECATED_IN... ):
$ cat /usr/include/openssl/sha.h | grep SHA | grep char ... unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); ...Creo que usa un búfer estático y se desaconseja su uso.
El proyecto recomienda usar la interfaz EVP Message Digests ahora.
( EDITAR ): estoy compilando igual que antes, este es mi comando de compilación (bastante simple):
sonido principal.c
Consulte Vinculación de bibliotecas OpenSSL a un programa . Debe agregar -lcrypto al final del comando de compilación.
( EDITAR , del comentario): Tengo openssl en /opt/local/include/openssl....
Tendrá más problemas porque probablemente esté enlazando en tiempo de ejecución con la versión incorrecta de la biblioteca OpenSSL. Para ese problema, consulte Vincular estáticamente OpenSSL en XCode . El mismo problema existe desde la línea de comando y Xcode.
Aquí está la solución más fácil. Tenga en cuenta que no usa -lcrypto ( -lfoo suele ser la solución, excepto cuando la vinculación en tiempo de ejecución al objeto compartido incorrecto se convierte en un problema):
clang main.c -I /opt/local/include /opt/local/lib/libcrypto.a -o my_hash.exeUn archivo es solo una colección de archivos de objetos, por lo que un archivo se puede usar en el lugar donde se requiere un archivo de objetos.
OS X no respeta los RPATH . Otra solución es compilar OpenSSL y su programa con un RPATH para que se cargue la versión correcta de la biblioteca en tiempo de ejecución. Para ello, consulte Compilación e instalación | ¿Utiliza RPATH en la wiki de OpenSSL y compila OpenSSL con RPATH? en Desbordamiento de pila.
¿Qué SDK está utilizando y qué versión de Xcode? OpenSSL quedó obsoleto en OS X 10.7 y se eliminó del SDK 10.11, que se envía con Xcode 7 Beta. La descarga de OpenSSL por separado debería funcionar, aunque es posible que deba cambiar la configuración de su proyecto para la nueva ubicación.