libc 和未定义的符号:stime

isa*_*zan 4 glibc libc

我有一个使用 FTDI 驱动程序库的 python 应用程序,名为:

/usr/local/lib64/libftd2xx.so.1.4.22
Run Code Online (Sandbox Code Playgroud)

当我使用 libc 2.27 运行该应用程序时,它工作正常。

当针对 libc 2.32 运行它时,它会失败并显示以下内容:

/usr/local/lib64/libftd2xx.so: undefined symbol: stime
Run Code Online (Sandbox Code Playgroud)

在查看 libc 版本时,确实有一些与 libc 2.31 中的 stime 相关的内容,如下所述: https: //lwn.net/Articles/811315/

它说:

“过时的函数 stime 不再可用于新链接的二进制文件,并且其声明已从 <time.h> 中删除。”

我对此的理解是,只有“新代码”无法编译/链接此函数,但使用此函数的现有库应该仍然可以工作。

事实上,如果我在 2.27 和 2.32 中查找 stime 符号,大致使用以下命令,我会发现 stime 就在那里:

2.27

root@PPL23:~# nm --demangle --dynamic --defined-only --extern-only /lib/x86_64-linux-gnu/libc-2.27.so* | grep stime
00000000000d5ee0 T stime
Run Code Online (Sandbox Code Playgroud)

2.32

localhost /tmp #  nm --demangle --dynamic --defined-only --extern-only /lib64/libc-2.32.so | grep stime
000000000012e490 T stime@GLIBC_2.2.5
Run Code Online (Sandbox Code Playgroud)

为什么 libc 2.32 不向后兼容现有的 FTDI 驱动程序?因为符号似乎在那里,所以即使在 2.32 版本中也不应该工作吗?

maj*_*zak 6

根据手册页,stime(2)已被弃用。

注意:该函数已被弃用;请改用clock_settime(2)。

代替:

stime(100)
Run Code Online (Sandbox Code Playgroud)

可以使用以下代码:

clock_settime(CLOCK_REALTIME, (struct timespec*){100,0})
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因您无论如何都想使用,您可以使用SymbolVersioningstime中建议的汇编技巧

__asm__(".symver stime,stime@GLIBC_2.2.5");
Run Code Online (Sandbox Code Playgroud)