人咬狗:符号在没有链接库的情况下解析?clock_gettime()-lrt

Man Bites Dog: symbol resolved *without* linking library? clock_gettime() -lrt

本文关键字:clock gettime -lrt 情况下 符号 链接 人咬狗      更新时间:2023-10-16

我有一个在Ubuntu 12.04下使用clang++3.2开发的C++源代码树,它构建了一些库,然后用这些库和其他各种系统库的常用集合编译一些应用程序。两个谜题。客户端报告代码无法通过对clock_gettime()的未定义引用进行构建。果不其然,我没有在构建逻辑(scons)中包含强制性的"-lrt"。

第一个难题:即使我没有在任何地方指定"-lrt">,它也能在我的系统上正确地编译、链接和执行,而且没有任何抱怨!如何正确解析此符号?我怀疑这是因为应用程序链接到一个动态库,而这个动态库本身需要librt,但我不明白为什么会发生这种情况?

第二个难题:假设对clock_gettime()如何在没有"-lrt"的情况下得到解决有一个令人满意的解释,为什么这种情况会发生在我的系统上,而不会发生在客户端非常相似的设置上?

"…一个谜,包裹在一个谜里"---温斯顿·丘吉尔

建议使用工具来揭示这里的真实情况将是最受欢迎的。

来自SUSv4(实用程序/c99):


-l rt

该选项应使<aio.h><mqueue.h><sched.h><semaphore.h><spawn.h>中引用的所有接口、<sys/mman.h>中标记为可选的接口、<fcntl.h>中标记为ADV(咨询信息)的接口以及<time.h>中以前缀clock_time_开头的接口可用在没有此选项的情况下,实现可能会搜索此库


我认为以上内容至少足以证明POSIX允许这种行为的原因。

在这方面,所涉及的系统很可能是不同的。例如,clock_gettime()可能在libc中为您实现,但在librt中为您的客户端实现。不要冒险:使用便携式-l rt,然后忘记这个问题。

一个更明显的例子是-l xnet,它的行为与POSIX类似,但至少在Gentoo、Debian和UbuntuLinux系统上,使用-l xnet编译实际上会产生错误。(据称libxnet包含UNIX套接字接口的实现。)

如果您想进一步调查这个问题,请在GNU/Linux系统中尝试lddldd应该显示二进制文件的动态依赖关系。我敢打赌,clock_gettime()只是在libc.so中实现的。