我正在尝试用C语言构建一个程序,它有很多依赖于各种共享库的可选功能。
在我们的异构计算集群中,并非所有这些库在所有系统上都可用(或最新)。
例如,来自较新的glibc (sched_getcpu@@GLIBC_2.6,__sched_cpucount@@GLIBC_2.6)或整个共享库(libnuma,libR,libpbs)的符号可能是可用的,也可能是不可用的。
我知道我可以使用libdl通过dlopen和dlsym来加载符号,但是对于越来越多的符号(目前大约有30个)来说,这样做充其量也是乏味的。
据我所知,Linux中的共享库在默认情况下是延迟加载的,因此在实际使用符号之前应该不需要它。
但是如果我尝试提前检查它,那么它在执行开始时就会失败:
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>
#include <sched.h>
int main() {
void *lib_handle;
int (*fn)(void);
int x;
char *error;
lib_handle = dlopen("libc.so.6", RTLD_LAZY);
if (!lib_handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
fn = dlsym(lib_handle, "sched_getcpu");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(1);
}
printf("%d\n", sched_getcpu());
return 0;
}在包含所有库的编译系统上:
$ icc test.c
$ ./a.out
10在另一个具有较新版本的GLIBC的系统上:
$ ./a.out
./a.out: /lib64/libc.so.6: version `GLIBC_2.6' not found (required by ./a.out)如果我注释掉实际调用sched_getcpu的代码行,那么我会在较小的系统上得到:
$ ./a.out
/lib64/libc.so.6: undefined symbol: sched_getcpu那么,有没有一种方法可以强制库只在使用时加载,并在使用它们的块之前进行这样的检查?
发布于 2012-12-19 02:19:58
不能用glibc。这是一个故障保险,它的位置,这样你就不会击中自己的脚。如果没有定义和查找GLIBC_2.6符号,即使没有其他丢失的符号,也可能会从glibc得到垃圾结果(数据损坏和崩溃),因为它不向前兼容。
如果您需要glibc级别的兼容性,则需要使用最低的通用版本进行构建。
https://stackoverflow.com/questions/13938860
复制相似问题