是否可以从可执行文件中取消 link 目标文件
Is it possible to un-link object files from an executable
背景: 我正在考虑开发一个类似于 Gentoo 中的 portage 的包管理器 Linux(我最终可能会 fork portage)。对于那些对 Gentoo 知之甚少的人来说,它是一个基于源代码的发行版,这意味着所有包都是从源代码编译而来的。目前可以将程序编译成目标文件,然后编译成可执行文件。
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ gcc a.o b.o -o executable
我想对 portage 做的改进如下。
- 能够仅重新编译已更新的目标文件(使用 GIT 或其他方式跟踪更改)。
- Decompile/Unlink 目标文件的可执行文件。
- Re-compile/re-link 目标文件仅用更新的目标文件替换旧目标文件(使用 GIT 或其他方式跟踪更改)。
- 然后新编译的包替换旧的包。 (琐碎的任务)
推理:我是一个 Arch linux 用户,他喜欢基于源代码的分发的想法,但不想为让我的系统保持最新的巨大任务而烦恼日期。我的大部分工作也是在带有小型硬盘驱动器的笔记本电脑上完成的,因此 de-compiling/un-linking 将可执行文件转换为目标文件而不是仅保留占用大量 space 的目标文件的原因.它还可能减少系统的整体编译时间,因为重新编译大部分源代码的需要将大大减少。它还允许一种简单的方法来更改包上的 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 的 linker “$ld
” 版本以记录它在 linking 目标文件时所做的更改,以便故意使程序 "reverse Engineerable" ???
编辑: 另一种用途是将单个目标文件与大型项目的可执行文件分开太远,以至于无法用新的目标文件交换分离的目标文件并重新link 再次。这将减少在仅更新一个文件时从许多不同文件重新link 大项目的开销。这将允许在二进制级别上进行增量编译。
不,这是不可能的。链接器的大量工作是用数字偏移量替换符号引用(对链接在一起的目标文件的任何组合有效)(仅对链接器决定在特定时间布置目标文件的特定组合的特定方式有效) .这样引用一旦"baked"就无法恢复
如果您 alter/configure ld
将每个目标文件的部分分开并在 executable 中保持每个目标文件的重定位 table 可能是可行的].如果您想获取原始文件名,还必须确保 ld
将目标文件名存储在 executable 中。
基本上,链接器可以将目标文件连接在一起,然后进行重定位,如果重定位是可逆的,您应该能够逆转该过程。
背景: 我正在考虑开发一个类似于 Gentoo 中的 portage 的包管理器 Linux(我最终可能会 fork portage)。对于那些对 Gentoo 知之甚少的人来说,它是一个基于源代码的发行版,这意味着所有包都是从源代码编译而来的。目前可以将程序编译成目标文件,然后编译成可执行文件。
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ gcc a.o b.o -o executable
我想对 portage 做的改进如下。
- 能够仅重新编译已更新的目标文件(使用 GIT 或其他方式跟踪更改)。
- Decompile/Unlink 目标文件的可执行文件。
- Re-compile/re-link 目标文件仅用更新的目标文件替换旧目标文件(使用 GIT 或其他方式跟踪更改)。
- 然后新编译的包替换旧的包。 (琐碎的任务)
推理:我是一个 Arch linux 用户,他喜欢基于源代码的分发的想法,但不想为让我的系统保持最新的巨大任务而烦恼日期。我的大部分工作也是在带有小型硬盘驱动器的笔记本电脑上完成的,因此 de-compiling/un-linking 将可执行文件转换为目标文件而不是仅保留占用大量 space 的目标文件的原因.它还可能减少系统的整体编译时间,因为重新编译大部分源代码的需要将大大减少。它还允许一种简单的方法来更改包上的 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 的 linker “$ld
” 版本以记录它在 linking 目标文件时所做的更改,以便故意使程序 "reverse Engineerable" ???
编辑: 另一种用途是将单个目标文件与大型项目的可执行文件分开太远,以至于无法用新的目标文件交换分离的目标文件并重新link 再次。这将减少在仅更新一个文件时从许多不同文件重新link 大项目的开销。这将允许在二进制级别上进行增量编译。
不,这是不可能的。链接器的大量工作是用数字偏移量替换符号引用(对链接在一起的目标文件的任何组合有效)(仅对链接器决定在特定时间布置目标文件的特定组合的特定方式有效) .这样引用一旦"baked"就无法恢复
如果您 alter/configure ld
将每个目标文件的部分分开并在 executable 中保持每个目标文件的重定位 table 可能是可行的].如果您想获取原始文件名,还必须确保 ld
将目标文件名存储在 executable 中。
基本上,链接器可以将目标文件连接在一起,然后进行重定位,如果重定位是可逆的,您应该能够逆转该过程。