libc 2.32运行FTDI驱动时报stime未定义符号问题咨询
问题原因分析
这是glibc的符号版本管理机制导致的兼容问题,核心逻辑如下:
- glibc废弃函数时,不会直接删除函数实现,只会移除该函数的默认导出符号(带
@@后缀的版本,供新程序编译链接时使用),仅保留带固定版本标记的兼容符号(仅带@后缀,仅用于匹配旧二进制的版本绑定请求) - 你在libc 2.27中查到的
stime是带默认版本标记的stime@@GLIBC_2.2.5(nm默认不显示符号版本后缀),可以匹配所有未指定版本的stime符号请求 - 从glibc 2.31开始,
stime的默认导出符号被移除,你在libc 2.32中查到的stime@GLIBC_2.2.5是仅用于旧版本绑定的兼容符号,无法匹配未指定版本的stime请求 - 你使用的闭源FTDI驱动库编译时没有显式绑定
stime的符号版本,动态链接器在libc 2.32环境下找不到默认版本的stime,就会报未定义符号错误
可用解决方案
方案1(推荐)
升级FTDI官方驱动库,官方已经推出了适配高版本glibc的更新包,直接替换旧的libftd2xx.so.1.4.22即可解决问题。
方案2(临时兼容,无需替换驱动)
编写一个垫片库劫持stime调用,用glibc仍支持的clock_settime实现对应功能,操作步骤如下:
- 新建
stime_shim.c文件,写入以下代码:
#include <time.h> int stime(const time_t *t) { struct timespec ts = { .tv_sec = *t, .tv_nsec = 0 }; return clock_settime(CLOCK_REALTIME, &ts); }
- 编译生成垫片库:
gcc -shared -fPIC -o libstime_shim.so stime_shim.c
- 运行应用时预加载该垫片库即可:
LD_PRELOAD=./libstime_shim.so python 你的应用启动脚本.py
方案3(不推荐)
手动修改FTDI驱动库的符号表,给stime请求添加@GLIBC_2.2.5版本绑定,该操作需要掌握ELF文件修改技能,操作不当会损坏驱动库。
内容的提问来源于stack exchange,提问作者isaac.hazan
相关产品推荐
相关产品推荐

