在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,但不会执行它。
答案 0 :(得分:1)
在Linux中,是否可以将两个二进制程序合并为一个可执行文件,同时仍允许两个程序执行?
当然,这一般是不可能的,而且这种不可能性并不是Linux特有的。 AFAIK所有主要操作系统也都有它。阅读executables,object files,ELF,linkers和Levine的书Linkers & loaders。
如果您有权访问prog1
和prog2
的源代码(并且您显然没有),那么您可以将每个源代码转换为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
之前被称为等...)
如果没有源代码,您可以将prog1
和prog2
的二进制可执行文件嵌入另一个mixprog.c
的数据,比较argv[0]
上面,解压缩某个目录中的prog1
或prog2
(可能是临时的),然后执行它(可能在该目录上使用execveat(2))。这种方法可能存在技术和法律问题。
或者,如果仅prog2
显示某条消息(不太可能),则可以使用strings(1)
顺便说一句,如果prog1
和prog2
都来自您的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
对我有用。
在提到的两个程序中,都可以使用我提到的命令将一个函数作为子函数调用给另一个函数。