这里有一个简单的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)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff6e6c4f000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff6e71d7000)
要使用musl-libc构建OpenSSL,我们还必须指定linux头的位置,以避免像<linux/mman.h>
这样的错误。
我只尝试使用Clang和Musl构建OpenSSL,下面是我使用https://gist.github.com/randoruf/d1aa4e8acb0a852addcd2b84fc003719的clang包装器。
(取自zo/items/399ab7ea716a56aef50c,由kakinaguru_zo编写)
但是在clang包装器中仍然存在一些问题。
不管构建库或可执行文件,这个包装器都将链接startfile (e.g. Scrt1.o
)。显然,只有可执行文件才需要开始文件。因此,如果使用此包装器,可能会遇到以下奇怪的错误(未找到main
符号):
$ musl-clang mylibrary.c -shared -fPIC -o libmylibrary.so
$ musl-ldd libmylibrary.so
ld-musl-x86_64.so.1 (0x7f49faef7000)
libc.so => ld-musl-x86_64.so.1 (0x7f49faef7000)
Error relocating libmylibrary.so: main: symbol not found
如果库有startfile,它可能有一个到main
的条目。这就是为什么找不到main
符号的原因。
解决方案是不包括共享库的startfile (新的clang包装器应该修复这个问题)。
另一个问题是,由于操作系统及其软件是针对glibc构建的,test_errstr
、test_ca
、test_ssl_new
无法通过。
详情张贴在我的博客https://randoruf.github.io/2022/08/23/musl-libc-ubuntu.html#about-the-test-case-in-openssl上。
最后一个问题是这个包装器只支持c语言。另一个包装器可能会有帮助,请参阅https://github.com/esjeon/musl-clang/blob/master/musl-clang
https://stackoverflow.com/questions/53187897
复制相似问题