美文网首页
libcurl 版本问题查找思路

libcurl 版本问题查找思路

作者: MasonChan | 来源:发表于2020-06-16 18:47 被阅读0次

问题现象

curl localhost:9200

curl: (48) An unknown option was passed in to libcurl

意思是执行 curl 命令时输入了无效参数。

yum

pycurl: libcurl link-time version is older than compile-time version

意思是正在使用的 libcurl 文件,它的软链接比编译时间还要旧。按照我们的普通思维,一般是先编译好文件,才能做软连接。

虽然是 2 个错误,但却是同一个原因造成的。

查找原因

定位所有 libcurl.so 文件,找到一个自己编译的 curl-7.21.7,版本比 yum 安装的 7.29.0 低:

locate -r "/libcurl.so$"

/apps/lib/curl-7.21.7/lib/libcurl.so
/usr/lib64/libcurl.so

定位所有 curl 可执行文件

locate -r "/curl$" | grep bin

/apps/lib/curl-7.21.7/bin/curl
/usr/bin/curl

执行 curl 命令查看 libcurl 版本

sudo curl --version | grep --color libcurl

curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.21.7 OpenSSL/1.0.0r zlib/1.2.7

可以看到,curl 版本是 yum 安装的那个,但是 libcurl 用的是自己编译的那个低版本。使用的版本和编译时的编译信息对不上,所以就报这个错。

curl -V | grep libcurl

curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.21 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.4.3

在环境变量 PATH 和 LD_LIBRARY_PATH 找不到 /apps/lib/curl,那么 /apps/lib/curl-7.21.7/lib/libcurl.so 这个文件是怎么被 curl 优先于 /usr/lib64/libcurl.so 找到的?

我们使用 strace 来跟踪一下:

strace curl -V > curl.log 2>&1

使用 vim 打开日志,打开的同时定位关键字:libcurl.so

vim curl.log +/libcurl.so

发现是 open /etc/ld.so.cache 之后,接着就 open /apps/lib/curl/lib/libcurl.so.4。那么我们推测是从 /etc/ld.so.cache 里面读到相关信息的:

execve("/usr/bin/curl", ["curl", "-V"], [/* 24 vars */]) = 0
brk(0)                                  = 0x1164000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5676b08000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=41067, ...}) = 0
mmap(NULL, 41067, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5676afd000
close(3)                                = 0
open("/apps/lib/curl/lib/libcurl.so.4", O_RDONLY|O_CLOEXEC) = 3

/etc/ld.so.cache 是一个二进制文件,用 strings 命令可以看到 /apps/lib/curl/lib/libcurl.so.4 的确在 /usr/lib64/libcurl.so 前面:

strings /etc/ld.so.cache | grep "/libcurl.so$"

/apps/lib/curl/lib/libcurl.so
/lib64/libcurl.so

ld.so.cache 的内容是使用 ldconfig 命令更新的,更新的配置信息来自 /etc/ld.so.conf:

cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

grep 搜索下 curl

grep -ir curl /etc/ld.so.conf.d/

/etc/ld.so.conf.d/user.conf:/apps/lib/curl/lib

这里配置了自己编译的 curl 目录!找出原因了,那么解决方法就出来了。

  • 1、直接在 /etc/ld.so.conf.d/user.conf 删除 libcurl 配置,然后执行 ldconfig 更新 ld.so.cache 信息,需要使用的时候,使用 export LD_LIBRARY_PATH=/apps/lib/curl/lib:$LD_LIBRARY_PATH 单独声明
  • 2、如果不需要 /apps/lib/curl,直接移除 /apps/lib/curl,例如:mv /apps/lib/curl /apps/lib/curl.bak

相关文章

网友评论

      本文标题:libcurl 版本问题查找思路

      本文链接:https://www.haomeiwen.com/subject/pnwrxktx.html