问题描述
问题现象
在容器环境中运行 HAMi-core 时,应用崩溃并报错:
./Service/ symbol lookup error: /usr/
local/vgpu/libvgpu.so: undefined symbol:
_dl_sym, version GLIBC_PRIVATE
根本原因
代码中使用了 _dl_sym ,这是 glibc 的 内部符号 ,带有 GLIBC_PRIVATE 版本标签。该符号:
- 不属于 glibc 公共 API
- 并非在所有 glibc 版本中都可用
- 在容器化环境中特别容易出问题(glibc 版本可能不同)
受影响的代码位置
- src/libvgpu.c - dlsym() 函数和 preInit() 函数
- src/nvml/hook.c - load_nvml_libraries() 函数
错误日志
[HAWI-core Msg
(1111:1114026345114368:libvgpu.c:839)]:
Initializing.....
./Service/ symbol lookup error: /usr/
local/vgpu/libvgpu.so: undefined symbol:
_dl_sym, version GLIBC_PRIVATE
每次应用尝试初始化时都会重复此错误。
运行环境
gcc 10.3.1
ctyunos 23.01
建议的修复方案
将所有 _dl_sym 的使用替换为可移植方案:
修改前:
real_dlsym = _dl_sym(RTLD_NEXT, "dlsym",
dlsym);
修改后:
void *libc_handle = dlopen("libc.so.6",
RTLD_LAZY);
if (libc_handle) {
real_dlsym = dlsym(libc_handle,
"dlsym");
}
需要修改的文件
-
src/libvgpu.c
- 替换 dlsym() 回退逻辑中的 _dl_sym
- 替换 preInit() 函数中的 _dl_sym
-
src/nvml/hook.c
- 替换 load_nvml_libraries() 函数中的 _dl_sym
-
src/include/libvgpu.h
- 移除 extern void* _dl_sym(void*, const char*, void*); 声明
修复效果
- ✅ 兼容所有 glibc 版本
- ✅ 在容器环境中可靠运行
- ✅ 仅使用 glibc 公共 API
- ✅ 不依赖内部/私有符号
补充说明
代码已经尝试使用 dlvsym(RTLD_NEXT, "dlsym", "GLIBC_2.2.5") 作为主要方法,但当 dlvsym 失败时,回退到 _dl_sym 会在未导出此私有符号的系统上失败。建议的修复使用标准 POSIX 函数提供健壮的回退方案。
问题描述
问题现象
在容器环境中运行 HAMi-core 时,应用崩溃并报错:
根本原因
代码中使用了 _dl_sym ,这是 glibc 的 内部符号 ,带有 GLIBC_PRIVATE 版本标签。该符号:
受影响的代码位置
错误日志
每次应用尝试初始化时都会重复此错误。
运行环境
gcc 10.3.1
ctyunos 23.01
建议的修复方案
将所有 _dl_sym 的使用替换为可移植方案:
修改前:
修改后:
需要修改的文件
src/libvgpu.c
src/nvml/hook.c
src/include/libvgpu.h
修复效果
补充说明
代码已经尝试使用 dlvsym(RTLD_NEXT, "dlsym", "GLIBC_2.2.5") 作为主要方法,但当 dlvsym 失败时,回退到 _dl_sym 会在未导出此私有符号的系统上失败。建议的修复使用标准 POSIX 函数提供健壮的回退方案。