version `GLIBC_2.17‘ not found问题的解决

引言

今天尝试在老旧的x210开发板上部署交叉编译的curl,结果遇到如下错误:

./curl: /lib/libc.so.6: version `GLIBC_2.17' not found (required by ./curl)
./curl: /lib/libc.so.6: version `GLIBC_2.17' not found (required by ./libcurl.so.4)
./curl: /lib/libc.so.6: version `GLIBC_2.17' not found (required by ./libcrypto.so.1.1)
./curl: /lib/libc.so.6: version `GLIBC_2.16' not found (required by ./libcrypto.so.1.1)

经过一番努力,终于解决了问题,记录在这里,拍日后忘记。 

问题分析

这个错误信息表明所使用的 curl 程序及其依赖库(libcurl.so.4 和 libcrypto.so.1.1)需要较新的 GLIBC(GNU C Library)版本(2.16 或 2.17),但系统中安装的 GLIBC 版本却低于此要求。查看了一下,x210开发板上部署的GLIBC的版本是2.15。而我使用的编译器的GLIBC版本是2.18。

使用arm-none-linux-gnueabi-nm查看了几个程序的符号表,发现有3个函数需要更高的版本。

有一个函数clock_gettime@@glibc_2.17容易处理,只需要在链接参数上加入-lrt即可。

另外两个函数getauxval和secure_getenv就没有那么简单了。

看了一下openssl-1.1.1t/crypto/getenv.c文件的相关代码:

char *ossl_safe_getenv(const char *name)
{
#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
# if __GLIBC_PREREQ(2, 17)
#  define SECURE_GETENV
    return secure_getenv(name);
# endif
#endif

#ifndef SECURE_GETENV
    if (OPENSSL_issetugid())
        return NULL;
    return getenv(name);
#endif
}

从中可以看出这里实际上在看GLIBC是否支持secure_getenv函数,如果不支持也有一个解决方案。所以,如果我们把# if __GLIBC_PREREQ(2, 17)改成# if __GLIBC_PREREQ(2, 19),编译时就会采用2.15版本支持的函数来实现。所以我们的解决办法就是把所有# if __GLIBC_PREREQ(2, 16)以上的说明都改成# if __GLIBC_PREREQ(2, 19)。

搜了一下代码,一共有5个地方需要修改:

结果这番操作之后,openssl顺利编译,并且curl在开发板上也可以运行了。

结语

为什么上面没有采用升级开发板的GLIBC的办法,因为比较麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神一样的老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值