从可执行文件中提取静态链接库

HyL*_*ian 8 c c++ linker static-libraries

我不确定这是否可行,但给定一个可执行文件(foo.exe),有许多已静态链接的库.

是否有任何软件从该文件中提取可执行文件中的.lib(或.a)?

谢谢.

pax*_*blo 15

不可思议的是,通常情况下,您不会将库的全部内容注入到可执行文件中.

您只能满足所有未定义的符号.这实际上可能只是图书馆的一小部分.库通常由一组目标文件组成,只有那些目标文件才链接到您的可执行文件中.

例如,如果您在C运行时库中调用的唯一内容是exit(),则printf()在可执行文件中不太可能具有该系列函数.

如果直接链接到目标文件,则可能有机会,因为无论是否使用它们都将被包括在内(除非您的链接器是智能链接器).

但即使这样也是一项艰巨的任务,因为可执行文件中可能没有关于哪些代码段来自特定目标文件的信息.这可能是可行的,但是,如果有另一种方式,我会先看一下.

让我澄清一下典型的过程:

  1. 四个目标文件a.o,b.o,c.od.o包含的功能a(),b(),c()d()分别.他们加入到abcd.a存档.
  2. 除了b()调用之外,它们都是独立的(没有依赖项)c().
  3. 你有一个调用的主程序a(),b()然后你编译它然后将它链接到abcd.a库.
  4. 链接器拖动a.ob.o出库和你的可执行文件,满足的需要a()b(),但引进需要c()的,因为b()需要它.
  5. 链接器然后c.o拖出库并进入您的可执行文件,满足需要c().现在所有未定义的符号都已满足,可执行文件已完成并且已粉碎,您可以在准备好后运行它.

在该过程的任何阶段都没有被d.o拖入您的可执行文件中,因此您没有希望将其删除.

更新:重新"如果有另一种方式,我将首先看一下"我在上面做出的评论,你刚刚在其他答案的评论中说明你有源代码使你想要提取的库.我需要问一下:为什么你不能用这个源重建库?在我看来,这比尝试从可执行代码的混乱中重新创建库要容易得多.