我可能在 GCC 或链接器中遇到了一个错误,当在运行时加载的共享库中有一个名为“错误”的全局变量时,就会发生这种错误。乍一看,在名为“error”的文本段中似乎有其他东西隐藏了这个变量。
富.c:
#include <stdio.h>
const char *error = "error";
const char *error2 = "error2";
void bar(void)
{
printf("%p\n", error2);
printf("%p\n", error);
printf("%s\n", error2);
printf("%s\n", error);
}
主.c:
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
void *lib_handle;
void (*fn)(void);
char *err;
lib_handle = dlopen("./libfoo.so", RTLD_LAZY);
if (!lib_handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
fn = dlsym(lib_handle, "bar");
if ((err = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", err);
exit(1);
}
(*fn)();
dlclose(lib_handle);
return 0;
}
编译和运行输出:
gcc -g -Wall -pedantic -fpic -O0 -c foo.c -o foo.o
gcc -shared -o libfoo.so foo.o
gcc main.c -Wall -fpic -o main -ldl
./main
0x7f62bc42c82b
0xfb8953f589555441
error2
Segmentation fault (core dumped)
这是一个工具链错误吗?如果是这样,什么可能导致这种情况以及应该在哪里报告?