Link 并调用两个独立的主电源
Link and call two separate mains
是否有可能通过一些 linker 魔术将两个文件与两个单独的 main()
一起 link 在一起,然后添加第三个控制 main()
将决定在运行时间调用另外两个主电源中的哪一个?
想象一下:
/* test1.c */
include <stdio.h>
int main()
{
printf("Test1\n");
}
/* test2.c */
include <stdio.h>
int main()
{
printf("Test2\n");
}
/* controller.c */
int main()
{
int x;
// x gets set somehow
if (x == 1)
// call main from test1.c
else if (x == 2)
// call main from test2.c
}
我意识到这可能是一个奇怪的问题,但我正在尝试解决 Cray 超级计算机上的限制,该限制允许我 运行 每个节点只有一个可执行文件。而且我明确不想修改 test1.c
和 test2.c
.
总之,没有办法。反正不直接。
一个可能的解决方案是使用例如system
(或 fork
和 exec
你自己)到 运行 新进程外部的特定程序。
另一种解决方案是将来自不同 main
函数的功能放在单独的函数中,如果定义了特定的预处理器宏,则 main
有条件地编译,并且 main
函数只是调用执行实际工作的特殊函数。
您可以尝试使用 PIE 和动态链接:
/* controller.c */
#include <stdio.h>
#include <errno.h>
#include <dlfcn.h>
int main(int argc, char *argv[])
{
int retval, (*pmain)(int argc, char *argv[]);
void *prg = dlopen(argv[1], RTLD_LAZY);
pmain = dlsym(prg, "main");
retval = (*pmain)(argc - 1, &argv[1]);
dlclose(prg);
return retval;
}
编译和 运行,它适用于我的 Linux:
gcc controller.c -o controller -ldl
gcc -fPIE -pie -Wl,--export-dynamic test1.c -o test1
gcc -fPIE -pie -Wl,--export-dynamic test2.c -o test2
./controller ./test1
Test1
./controller ./test2
Test2
是否有可能通过一些 linker 魔术将两个文件与两个单独的 main()
一起 link 在一起,然后添加第三个控制 main()
将决定在运行时间调用另外两个主电源中的哪一个?
想象一下:
/* test1.c */
include <stdio.h>
int main()
{
printf("Test1\n");
}
/* test2.c */
include <stdio.h>
int main()
{
printf("Test2\n");
}
/* controller.c */
int main()
{
int x;
// x gets set somehow
if (x == 1)
// call main from test1.c
else if (x == 2)
// call main from test2.c
}
我意识到这可能是一个奇怪的问题,但我正在尝试解决 Cray 超级计算机上的限制,该限制允许我 运行 每个节点只有一个可执行文件。而且我明确不想修改 test1.c
和 test2.c
.
总之,没有办法。反正不直接。
一个可能的解决方案是使用例如system
(或 fork
和 exec
你自己)到 运行 新进程外部的特定程序。
另一种解决方案是将来自不同 main
函数的功能放在单独的函数中,如果定义了特定的预处理器宏,则 main
有条件地编译,并且 main
函数只是调用执行实际工作的特殊函数。
您可以尝试使用 PIE 和动态链接:
/* controller.c */
#include <stdio.h>
#include <errno.h>
#include <dlfcn.h>
int main(int argc, char *argv[])
{
int retval, (*pmain)(int argc, char *argv[]);
void *prg = dlopen(argv[1], RTLD_LAZY);
pmain = dlsym(prg, "main");
retval = (*pmain)(argc - 1, &argv[1]);
dlclose(prg);
return retval;
}
编译和 运行,它适用于我的 Linux:
gcc controller.c -o controller -ldl
gcc -fPIE -pie -Wl,--export-dynamic test1.c -o test1
gcc -fPIE -pie -Wl,--export-dynamic test2.c -o test2
./controller ./test1
Test1
./controller ./test2
Test2