![]() |
阳光的甜瓜 · Android内存泄漏原理分析和优化实践 - 简书· 2 年前 · |
![]() |
聪明伶俐的冰棍 · python转化gif动态图为像素图 - 简书· 2 年前 · |
![]() |
谦逊的板栗 · JS 十进制 转 十六进制_js ...· 2 年前 · |
![]() |
帅气的地瓜 · windows PID = 0 ...· 2 年前 · |
这里有一个简单的hello world sha1 1-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);
}
在安装了libssl-dev的Mint/Ubuntu上,我可以编译并链接到
$CC sha.c
(其中CC是gcc、tcc或clang之一),然后成功地运行它,但这并不适用于musl,所以我抓取了openssl源代码(
git clone https://github.com/openssl/openssl
),配置了openssl源代码(
git clone https://github.com/openssl/openssl
),构建了它,并安装了它,现在运行
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
是什么导致了这件事,我该怎么解决呢?
发布于 2022-08-26 08:40:17
似乎您的OpenSSL是 ,而不是针对musl 构建的。
musl有自己的动态链接器(请参阅
https://wiki.musl-libc.org/faq.html
),我们可以为musl动态链接器创建一个软链接。(
-syslibdir
是动态库(例如
ld-musl-x86_64.so.1
)所在的目录,参见
https://wiki.musl-libc.org/getting-started.html
)
sudo ln -sf <YOUR-MUSL-LIBC-syslibdir/ld-musl-x86_64.so.1> /usr/bin/musl-ldd
然后,您可以看到openssl是否是针对musl构建的。当我使用glibc构建OpenSSL时,它显示了以下错误
$ musl-ldd <YOUR-OPENSSL-SRC>/libcrypto.so.1.1
musl-ldd (0x7fcd5a749000)
libdl.so.2 => musl-ldd (0x7fcd5a749000)
libpthread.so.0 => musl-ldd (0x7fcd5a749000)
libc.so.6 => musl-ldd (0x7fcd5a749000)
Error relocating ./libcrypto.so.1.1: makecontext: symbol not found
Error relocating ./libcrypto.so.1.1: setcontext: symbol not found
Error relocating ./libcrypto.so.1.1: __register_atfork: symbol not found
Error relocating ./libcrypto.so.1.1: getcontext: symbol not found
滑翔机的动态链接器也很好,
$ ldd <YOUR-OPENSSL-SRC>/libcrypto.so.1.1
linux-vdso.so.1 (0x00007ffd395a6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff6e6e64000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff6e6e41000)