【问题标题】:libc and undefined symbol: stimelibc 和未定义的符号:stime
【发布时间】:2021-11-27 15:06:16
【问题描述】:

我有一个使用 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 中的时间相关的内容,如下所述:https://lwn.net/Articles/811315/

上面写着:

"已过时的函数 stime 不再可用于新链接的 二进制文件,其声明已从 中删除。"

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

事实上,如果我在 2.27 和 2.32 中粗略地查找以下命令的时间符号,我发现时间就在那里:

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 版本也不应该工作吗?

【问题讨论】:

  • 问题是什么?
  • 问题是为什么libc没有实现向后兼容

标签: glibc libc


【解决方案1】:

根据手册页,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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2012-01-02
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多