后台:我正在开发一个类似于Gentoo Linux中portage的软件包管理器(我可能最终要求移植portage)。对于那些对Gentoo知之甚少的人来说,它是一个基于源的发行版,这意味着所有的包都是从源代码编译的。目前,可以将程序编译为目标文件,然后编译为可执行文件。
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ gcc a.o b.o -o executable
我想对portage进行的改进如下。
推理:我是一名Arch linux用户,他喜欢基于源代码的分发理念,但却无法承受让我的系统保持最新状态的巨大任务。我还在一台带有小硬盘的笔记本电脑上完成了大部分工作,因此将可执行文件反编译/取消链接到目标文件的原因就是保留占用大量空间的目标文件。它还可能减少系统的整体编译时间,因为重新编译大多数源代码的需求将大大减少。它还允许一种简单的方法来更改包上的USE标记,而无需完全重新编译。
问题:是否可以将目标文件编译为可执行文件,然后重新编译回目标文件。下面是一个例子。
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ gcc a.o b.o -o executable
然后
$ SomeCommand executable
output << a.o b.o
如果目前无法做到这一点。是否可以修改GNU的链接器“$ld
”的版本以记录它在链接目标文件时所做的更改,从而使故意使程序“反向可操作”???
编辑:对此的另一个用途是将单个对象文件与大型项目的可执行文件分开,以将分离的目标文件与新文件交换并再次重新链接。当只更新一个项目时,这将减少从大量不同文件重新链接大型项目的开销。这将允许在二进制级别上进行增量编译。
答案 0 :(得分:3)
不,这是不可能的。大量的链接器工作正在用数字偏移替换符号引用(对链接在一起的目标文件的任何组合有效)(仅对链接器决定布置特定目标文件组合的特定方式有效,特定时间)。一旦参考文献&#34;烘焙&#34;这样,就无法恢复。
答案 1 :(得分:0)
如果您更改/配置ld
以保留每个目标文件的部分并且还为可执行文件中的每个目标文件保留重定位表,则可能是可行的。如果要获取原始文件名,还必须确保ld
将对象文件名存储在可执行文件中。
基本上,链接器可以将目标文件连接在一起,然后进行重定位,如果重定位是不可逆的,则应该能够反转该过程。