Skip to content

[Bug] 容器环境中运行时错误:未定义符号 _dl_sym 版本 GLIBC_PRIVATE #174

@weapons97

Description

@weapons97

问题描述

问题现象

在容器环境中运行 HAMi-core 时,应用崩溃并报错:

Image
./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 版本可能不同)

受影响的代码位置

  1. src/libvgpu.c - dlsym() 函数和 preInit() 函数
  2. 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

Image Image

建议的修复方案

将所有 _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");
}

需要修改的文件

  1. src/libvgpu.c

    • 替换 dlsym() 回退逻辑中的 _dl_sym
    • 替换 preInit() 函数中的 _dl_sym
  2. src/nvml/hook.c

    • 替换 load_nvml_libraries() 函数中的 _dl_sym
  3. 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 函数提供健壮的回退方案。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions