C-链接并致电两个单独的主电源



是否有可能通过某些Linker Magic与两个单独的main() S将两个文件链接在一起,然后添加第三个控制main(),该文件可以在运行时决定其他两个主电源中的哪一个?

所以想象:

/* test1.c */
include <stdio.h>
int main()
{
    printf("Test1n");
}
/* test2.c */
include <stdio.h>
int main()
{
    printf("Test2n");
}
/* 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超级计算机的限制进行限制,该cray超级计算机使我只能运行每个节点的单个可执行文件。而且我明确不想修改test1.ctest2.c

您可以尝试使用馅饼和动态链接:

/* 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

简而言之,没有可能的方法。无论如何不是直接。

一个可能的解决方案是使用例如system(或forkexec您自己)在新过程中外部运行特定程序。

另一个解决方案是将不同main函数的功能放在单独的功能中,如果定义了特定的预处理器宏,则在有条件地编译main,而main函数只需调用从事实际工作的特殊功能。/p>

最新更新