Исправление ошибок динамического компоновщика при использовании libc с openssl - PullRequest
0 голосов
/ 07 ноября 2018

Вот простой hel1 world sha1-hasher, использующий библиотеку openssl.

#include <openssl/sha.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    system("printf '%s' 'hello world' | sha1sum");

    unsigned char digest[SHA_DIGEST_LENGTH];
    char digest_pr[(SHA_DIGEST_LENGTH)*2+1];
    SHA_CTX ctx;
    if(!SHA1_Init(&ctx)) return 1;
#define STR_STRLEN(A) A, (sizeof(A)/sizeof(*(A))-1)
    if(!SHA1_Update(&ctx,STR_STRLEN("hello"))) return EXIT_FAILURE;
    if(!SHA1_Update(&ctx,STR_STRLEN(" world"))) return EXIT_FAILURE;
    if(!SHA1_Final(digest,&ctx)) return EXIT_FAILURE;
    #define DIGITS "0123456789abcdef"
    for(size_t i=0;i<sizeof(digest);i++){
        digest_pr[i*2+0]=DIGITS[digest[i]/16];
        digest_pr[i*2+1]=DIGITS[digest[i]%16];
    }
    digest_pr[(SHA_DIGEST_LENGTH)*2]='\0';
    puts(digest_pr);
}

В Mint / Ubuntu с установленной libssl-dev я могу скомпилировать и связать его с $CC sha.c (где CC - один из gcc, tcc или clang), а затем успешно запустить, но это не сработало с musl, поэтому я взял исходный код openssl (git clone https://github.com/openssl/openssl), настроил его на ./config --prefix=/usr/local/musl, собрал его и установил, а теперь musl-gcc sha.c -lcrypto works, но при запуске LD_LIBRARY_PATH=/usr/local/musl/lib a.out я получаю:

Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __fprintf_chk: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: makecontext: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: setcontext: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __register_atfork: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __memcpy_chk: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __strcat_chk: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: secure_getenv: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __vfprintf_chk: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __syslog_chk: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __memset_chk: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __fread_chk: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: getcontext: symbol not found
Error relocating /usr/local/musl/lib/libcrypto.so.1.1: __sprintf_chk: symbol not found

Что является причиной этого и как я могу это исправить?

...