在我程序中,我计算一个全局变量并产生一个加载共享库的子程序(这是SSCCE,所以它很愚蠢,但可能是最小的例子)。
使用gcc main.c common.o -o program
编译的main.c
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
extern char **environ;
extern int g_common;
int main() {
char *argv[2] = {"/bin/true", NULL};
// SSCCE HACK: don't do this at home!
// environ[0] is unimportant so we replace it
environ[0] = "LD_PRELOAD=/tmp/foobar.so";
g_common = 1;
printf("main: g_common is %d\n", g_common);
if (!fork())
execve(*argv, argv, environ);
}
全局变量在中定义
使用gcc -fPIC -rdynamic -c common.c
编译的common.c
int g_common;
而dyno库是
使用编译的foobar.c
gcc -shared -fPIC -Wl,-init,init common.o foobar.c -o /tmp/foobar.so
#include <stdio.h>
extern int g_common;
void init() {
printf("foobar.so: g_common is %d\n", g_common);
}
现在您可以猜到我在这里想要做什么了。
在主program
中,我想计算一些东西,这里是g_common
。实际上,这是一个很长的计算,所以我只想做一次。
然后在程序的后面,我产生了子程序,这些子程序动态地预加载库,并且在该库中,我希望使用之前计算的值。
这里只有一个程序,但实际上有数千个,我不想每次都在init()
函数中为预加载库重新计算g_common
值。
当然,我尝试做的不起作用,程序打印1,但是子程序打印0(未初始化)。这是因为有两个g_common
实例。
好的,那么如何正确地执行此操作,以便我只计算一次g_common
?
https://stackoverflow.com/questions/51349054
复制