在Linux中,是否可以将两个二进制程序合并为一个可执行文件,同时仍允许两个程序执行?
我有几个没有源代码的程序二进制文件,我希望将它们附加到我的小程序中,以便为用户显示其他数据。下面是一个小例子:
prog1.c显示时间信息:

#include <stdio.h>
#include <time.h>

int main(){

    time_t t = time(NULL);
    struct tm time_stamp = *localtime(&t);

    printf("Date: %d-%d-%d (mm/dd/yyyy) \n",time_stamp.tm_mon+1,time_stamp.tm_mday, time_stamp.tm_year+1900);
    printf("Time: %d:%d \n", time_stamp.tm_hour, time_stamp.tm_min);
    return 0;
}

prog2.c显示作者信息:
#include <stdio.h>
void main(){
    printf("INFO: Originally developed by Jake.");
}

我希望将prog1附加到prog2中,这样调用prog1将执行prog2并显示作者信息。输出如下:
Date: 11-19-2015 (mm/dd/yyyy)
Time: 11:46
INFO: Originally developed by Jake.

这个想法听起来类似于自解压档案,但还没有看到一个有效的例子。只需使用cat、dd等将prog2附加到prog1的末尾,就可以附加prog2,但不会执行它。

最佳答案

在Linux中,是否可以将两个二进制程序合并为一个可执行文件,同时仍允许两个程序执行?
当然,这在一般情况下是不可能的,而且这种不可能并不是linux特有的。所有主要的操作系统都有。阅读executablesobject filesELFlinkers和莱文的书Linkers & loaders
如果您可以访问prog1prog2的源代码(显然您没有),您可以将它们中的每一个转换为shared library,然后编写一个包装器来动态加载其中一个,例如使用dlopen(3)
您还可以更改源代码以消除任何潜在的名称冲突(因此避免在两者中定义相同的名称),将prog1'smain重命名为prog1_main,将prog2'smain重命名为prog2_main,并使用类似

  extern int prog1_main(int, char**);
  extern int prog2_main(int, char**);
  int main(int argc, char**argv) {
     if (!strcmp(basename(argv[0]), "prog1")
        return prog1_main(argc, argv);
     else if (!strcmp(basename(argv[0]), "prog2")
        return prog2_main(argc, argv);
     else { fprintf(stderr, "bad program name %s\n", argv[0]);
            exit(EXIT_FAILURE); }
  }

IIRC,Sunos3在1987年做过这样的把戏…(当时,共享图书馆不像我们今天那样存在)
(这样的一个技巧可能并不总是适用于C++,因为它可以有静态数据,构造函数要在<
如果没有源代码,您可以将mainprog1的二进制可执行文件作为另一个prog2的数据嵌入,像上面这样比较mixprog.c,并在某个目录(可能是临时目录)中提取argv[0]prog1,然后执行它(可能是在该目录上使用execveat(2))。这种做法可能存在技术和法律问题。
或者,如果prog2只显示一些消息(这不太可能),则可以使用strings(1)提取它。
顺便说一下,如果prog2prog1都来自您的linux发行版,那么它们很可能是free software,您应该处理它们的源代码。如果其中一个是proprietary,请确保其许可证允许您(合法地)做您想象的事情。

关于c - 在保留功能的同时在linux中合​​并两个程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34171811/

10-12 21:47