我有一个使用 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 版本中也不应该工作吗?
根据手册页,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)
| 归档时间: |
|
| 查看次数: |
2437 次 |
| 最近记录: |