【发布时间】:2010-12-16 06:48:29
【问题描述】:
我不确定这是否可能,但给定一个可执行文件 (foo.exe),其中包含许多静态链接的库。
是否有任何软件可以从此文件中提取可执行文件中的 .lib(或 .a)?
谢谢。
【问题讨论】:
标签: c++ c linker static-libraries
我不确定这是否可能,但给定一个可执行文件 (foo.exe),其中包含许多静态链接的库。
是否有任何软件可以从此文件中提取可执行文件中的 .lib(或 .a)?
谢谢。
【问题讨论】:
标签: c++ c linker static-libraries
这不太可能,因为通常情况下,您不会将库的全部内容注入到您的可执行文件中。
你只得到足够的满足所有未定义的符号。这实际上可能只是库的一小部分。库通常由一组目标文件组成,其中只有需要的文件才会链接到您的可执行文件中。
例如,如果您在 C 运行时库中调用的唯一内容是 exit(),则您的可执行文件中不太可能包含 printf() 系列函数。
如果您直接链接到目标文件,您可能会有机会,因为无论是否使用它们都会包含在内(除非您的链接器是智能的)。
但即使这样也将是一项艰巨的任务,因为可执行文件中可能没有关于哪些代码段来自特定目标文件的信息。这可能是可行的,但如果有其他方法,我会先看看。
让我澄清一下典型的过程:
a.o、b.o、c.o和d.o分别包含函数a()、b()、c()和d()。它们全部添加到 abcd.a 存档中。b() 调用c() 之外,它们都是独立的(无依赖关系)。a() 和b() 的主程序,您对其进行编译,然后将其与abcd.a 库链接。a.o 和b.o 拖出库并进入您的可执行文件,满足a() 和b() 的需求,但引入了c() 的需求,因为b() 需要它。
c.o 拖出库并进入您的可执行文件,以满足c() 的需要。现在所有未定义的符号都已满足,可执行文件已完成并除尘,您可以在准备好后运行它。在该过程的任何阶段都没有将d.o 拖入您的可执行文件中,因此您将其取出的希望为零。
更新:关于 “如果有其他方法,我会先看那个” 我在上面发表的评论,你刚刚在评论中说明了一个您拥有制作要提取的库的源代码的其他答案。我需要问:为什么你不能用那个源重建库?在我看来,这比尝试从一堆可执行代码中重新创建库要容易得多。
【讨论】:
想象一下,有 10 本您不懂的语言的书,没有封面、标题页、页码和章节。有些书可能不完整。所有页面都混在一起,所以不可能找出每本书的开始和结束位置。(每一页都是一个函数调用)现在尝试找到第 5 本书的第 123 页(假设上面提到了函数 Exit() )。
嗯,有可能……
【讨论】:
看来您要的是反编译器。这样的工具很难使用(对于稍微复杂的 C++ 来说可能是不可能的),如果有任何其他方法可以解决您的问题,包括花几个月的时间重写库,我建议您采取这种做法。
就像 pax 指出的那样,即使您确实使用了反编译器,您也只能获得可执行文件调用的库函数。
【讨论】: