Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

299
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda