首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在openssl中使用libc时修复动态链接器错误

在openssl中使用libc时修复动态链接器错误
EN

Stack Overflow用户
提问于 2018-11-07 10:45:02
回答 1查看 1.1K关注 0票数 2

这里有一个简单的hello world sha1 1-hasher,它使用openssl库。

代码语言:javascript
运行
复制
#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使我感到满意:

代码语言:javascript
运行
复制
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

是什么导致了这件事,我该怎么解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)

代码语言:javascript
运行
复制
sudo ln -sf <YOUR-MUSL-LIBC-syslibdir/ld-musl-x86_64.so.1> /usr/bin/musl-ldd  

然后,您可以看到openssl是否是针对musl构建的。当我使用glibc构建OpenSSL时,它显示了以下错误

代码语言:javascript
运行
复制
$ 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

滑翔机的动态链接器也很好,

代码语言:javascript
运行
复制
$ 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符号):

代码语言:javascript
运行
复制
$ 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_errstrtest_catest_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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53187897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档