引言
今天尝试在老旧的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的办法,因为比较麻烦。