在Linux中合​​并两个程序,同时保留功能

时间:2015-12-09 06:05:46

标签: c linux executable binaryfiles

在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.");
}

我希望用prog2追加prog1,这样调用prog1就会执行prog2并显示作者信息。输出看起来像:

Date: 11-19-2015 (mm/dd/yyyy) 
Time: 11:46
INFO: Originally developed by Jake.

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

3 个答案:

答案 0 :(得分:1)

  

在Linux中,是否可以将两个二进制程序合并为一个可执行文件,同时仍允许两个程序执行?

当然,这一般是不可能的,而且这种不可能性并不是Linux特有的。 AFAIK所有主要操作系统也都有它。阅读executablesobject filesELFlinkers和Levine的书Linkers & loaders

如果您有权访问prog1prog2的源代码(并且您显然没有),那么您可以将每个源代码转换为shared library,然后编写一个动态加载其中一个的包装器,例如dlopen(3)

您还可以更改源代码以删除任何潜在的名称冲突(因此避免在两者中定义相同的名称),将prog1&#39; s main重命名为prog1_main ,将prog2&#39; s main重命名为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 ++,因为它可以包含静态数据,构造函数在 main之前被称为等...)

如果没有源代码,您可以将prog1prog2的二进制可执行文件嵌入另一个mixprog.c数据,比较argv[0]上面,解压缩某个目录中的prog1prog2(可能是临时的),然后执行它(可能在该目录上使用execveat(2))。这种方法可能存在技术和法律问题。

或者,如果仅prog2 显示某条消息(不太可能),则可以使用strings(1)

提取消息

顺便说一句,如果prog1prog2都来自您的Linux发行版,那么它们很可能是free software,您应该使用它们的源代码。如果其中一个是proprietary,请确保其许可证允许您(合法地)按照您的想象行事。

答案 1 :(得分:0)

如果 prog1 prog2 启动后不再需要执行,那么您可以使 prog1 调用 prog2 通过execv() family的一个函数。

答案 2 :(得分:-4)

Another question with same prespective>

是的,您可以一起运行,同时搜索我想出的解决方案。

gcc prog1 prog2 -o prog_combined

执行后,您将在同一文件夹中获得可执行文件“ prog_combined”。 在执行之前将两个文件保留在同一文件夹中。

./prog_combined

对我有用。

在提到的两个程序中,都可以使用我提到的命令将一个函数作为子函数调用给另一个函数。