Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

300
Views
Símbolos indefinidos para la arquitectura x86_64 (clang)

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.c

Y 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)
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

#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.exe

Un 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.

over 4 years ago · Santiago Trujillo Report

0

¿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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!