很难猜测是什么促使了如此彻底的改变
事实并非如此:它从来没有正常工作过。
破坏了这么多代码
该代码已经以微妙的方式被破解。现在你会得到一个明确的指示,表明它不起作用。
还有其他选择吗?
不这样做吗?
有什么问题dlopen
ing 一个可执行的解决方案?
如果这是一个真正的问题,请打开 GLIBC bugzilla 功能请求,解释该问题并请求支持的机制以实现所需的结果。
Update:
至少说一下为什么“它从来没有正常工作过”。是一些琐碎的事情,比如可执行文件之间可能发生全局冲突,还是真实的事情?
线程局部变量就是一个不能正常工作的例子。不管你认为它们是“真实的”还是假的,我不知道。
这是代码:
// foo.c
#include <stdio.h>
__thread int var;
__attribute__((constructor))
static void init()
{
var = 42;
printf("foo.c init: %d %p\n", var, &var);
}
int bar() {
printf("foo.c bar: %d %p\n", var, &var);
return var;
}
int main()
{
printf("foo.c main: %d %p bar()=%d\n", var, &var, bar());
return 0;
}
gcc -g foo.c -o foo -Wl,-E -fpie -pie && ./foo
foo.c init: 42 0x7fb5dfd7d4fc
foo.c bar: 42 0x7fb5dfd7d4fc
foo.c main: 42 0x7fb5dfd7d4fc bar()=42
// main.c
// Error checking omitted for brevity
#include <dlfcn.h>
#include <stdio.h>
int main()
{
void *h1 = dlopen("./foo", RTLD_LOCAL|RTLD_LAZY);
int (*bar)(void) = dlsym(h1, "bar");
printf("main.c: %d\n", bar());
return 0;
}
gcc -g main.c -ldl && ./a.out
foo.c init: 42 0x7fb7305da73c
foo.c bar: 0 0x7fb7305da73c <<< what?
main.c: 0 <<< what?
这是使用GNU C Library (Debian GLIBC 2.28-10) stable release version 2.28.
底线:这从来都不是为了工作而设计的,而你只是碰巧没有踩到许多地雷,所以你认为它正在工作,而事实上你正在练习未定义的行为。