libc和未定义符号:stime

3

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

/usr/local/lib64/libftd2xx.so.1.4.22

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

当我使用libc 2.32运行它时,出现以下错误:

/usr/local/lib64/libftd2xx.so: undefined symbol: stime

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

它说:

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

我的理解是只有“新代码”无法使用此功能进行编译/链接,但仍可使用正在使用此功能的现有库。

实际上,如果我使用以下命令在2.27和2.32中搜索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

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

为什么libc 2.32与现有的FTDI驱动程序不兼容?既然符号似乎存在,那么即使是2.32版本,它们也应该可以一起使用,对吗?


什么是问题? - majkrzak
1
问题是为什么libc不能实现向后兼容性。 - isaac.hazan
1个回答

5

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

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

不要使用:

stime(100)

以下代码可用:
clock_settime(CLOCK_REALTIME, (struct timespec*){100,0})

如果由于某种原因您仍想使用stime,则可以使用SymbolVersioning中提出的汇编技巧。
__asm__(".symver stime,stime@GLIBC_2.2.5");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接