Loading executable or executing a library
关于如何执行库或动态加载可执行文件有大量关于 SO 的问题。据我所知,所有答案都归结为:将您的可执行文件编译为与位置无关的代码并使用
很难猜测是什么促成了如此彻底的改变,破坏了如此多的代码和有用的用例。 (关于 Patchwork 和 Bugzilla 的解释对我来说没有多大意义。)但是现在有一个问题:如果您想创建一个也是动态库的可执行文件,或者反之亦然,该怎么办? 其中一条评论链接了一个解决方案。在这里复制它以供后代使用: const char service_interp[] __attribute__((section(".interp"))) ="/lib/ld-linux-x86-64.so.2"; extern"C" { void lib_entry(void) } 用 我有两个问题: 请看这个答案: https://stackoverflow.com/a/68339111/14760867 It’s difficult to guess what prompted such a radical change 并非如此:它从未正常工作过。 that breaks so much code 该代码已经以微妙的方式被破坏了。现在您可以清楚地看到它不起作用。 Are there other alternatives? 不要那样做吗? 如果这是一个真正的问题,请打开 GLIBC bugzilla 功能请求,解释该问题并请求支持的机制以达到预期的结果。 更新: at least say why”it never worked correctly”. Is it some triviality like potentially clashing globals between the executables, or something real? 线程局部变量是一个不能正常工作的例子。你是否认为它们是”真实的”我不知道。 代码如下: __thread int var; __attribute__((constructor)) int bar() { int main() int main() printf("main.c: %d/ 这是使用 底线:这从未被设计为有效,而且您只是碰巧没有踩到许多地雷,所以您认为它有效,而实际上您正在执行未定义的行为。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <unistd.h>
{
printf("Entry point of the service library/
");
_exit(0);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
static void init()
{
var = 42;
printf("foo.c init: %d %p/
", var, &var);
}
printf("foo.c bar: %d %p/
", var, &var);
return var;
}
{
printf("foo.c main: %d %p bar()=%d/
", var, &var, bar());
return 0;
}
2
3
4
foo.c init: 42 0x7fb5dfd7d4fc
foo.c bar: 42 0x7fb5dfd7d4fc
foo.c main: 42 0x7fb5dfd7d4fc bar()=42
2
3
4
5
6
7
8
9
10
11
12
13
14
// Error checking omitted for brevity
#include <dlfcn.h>
#include <stdio.h>
{
void *h1 = dlopen("./foo", RTLD_LOCAL|RTLD_LAZY);
int (*bar)(void) = dlsym(h1,"bar");
", bar());
return 0;
}
2
3
4
foo.c init: 42 0x7fb7305da73c
foo.c bar: 0 0x7fb7305da73c <<< what?
main.c: 0 <<< what?
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/269899.html