【问题标题】:Extract statically linked libraries from an executable从可执行文件中提取静态链接库
【发布时间】:2010-12-16 06:48:29
【问题描述】:

我不确定这是否可能,但给定一个可执行文件 (foo.exe),其中包含许多静态链接的库。

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

谢谢。

【问题讨论】:

    标签: c++ c linker static-libraries


    【解决方案1】:

    这不太可能,因为通常情况下,您不会将库的全部内容注入到您的可执行文件中。

    你只得到足够的满足所有未定义的符号。这实际上可能只是库的一小部分。库通常由一组目标文件组成,其中只有需要的文件才会链接到您的可执行文件中。

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

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

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

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

    1. 四个目标文件a.ob.oc.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 拖入您的可执行文件中,因此您将其取出的希望为零。

    更新:关于 “如果有其他方法,我会先看那个” 我在上面发表的评论,你刚刚在评论中说明了一个您拥有制作要提取的库的源代码的其他答案。我需要问:为什么你不能用那个源重建库?在我看来,这比尝试从一堆可执行代码中重新创建库要容易得多。

    【讨论】:

    • 该场景包含多个自定义对象文件,将它们链接到单个自定义库文件中,并在可执行文件中静态链接库文件。如果所有库都是自定义库,它们不是“完全嵌入”到可执行文件中吗?其实我不想获取源代码,我只想获取库文件。
    • 如果库中的每个目标文件都需要满足所有未定义的符号,那么是的,它们都会在那里。但不一定如此。
    • 让我们退后一步。为什么没有 .sl/.a 文件?
    • “除非你的链接器非常聪明”——比如自 2002 年以来的 Visual C++;用 /Gy 编译并用 /OPT:REF 链接以进行函数级链接。
    • 好的,删除“难以置信”的部分 - 不想让那些 MS 的程序员大吃一惊:-)
    【解决方案2】:

    想象一下,有 10 本您不懂的语言的书,没有封面、标题页、页码和章节。有些书可能不完整。所有页面都混在一起,所以不可能找出每本书的开始和结束位置。(每一页都是一个函数调用)现在尝试找到第 5 本书的第 123 页(假设上面提到了函数 Exit() )。

    嗯,有可能……

    【讨论】:

    • 你有第 5 本书的原稿。从手稿中重印第 5 本书肯定更容易。
    【解决方案3】:

    看来您要的是反编译器。这样的工具很难使用(对于稍微复杂的 C++ 来说可能是不可能的),如果有任何其他方法可以解决您的问题,包括花几个月的时间重写库,我建议您采取这种做法。

    就像 pax 指出的那样,即使您确实使用了反编译器,您也只能获得可执行文件调用的库函数。

    【讨论】:

    • 但我不想完全反编译可执行文件,我不需要源代码,我需要的是在该可执行文件中链接的库文件,并将另一个不同的可执行文件与该文件链接图书馆。
    • 你有库的头文件吗?
    • 是的,我有,实际上我拥有生成这些库的所有源代码。
    • 如果你有源代码,为什么不直接重新制作库?
    • 我有源代码和最终的可执行文件。构建所有库需要花费大量时间,我只想更改最终应用程序的一小部分。此外,我对链接器的工作原理感到好奇 :)
    猜你喜欢
    • 2013-06-24
    • 2011-06-07
    • 2010-12-25
    • 2010-12-07
    • 1970-01-01
    • 2011-08-06
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多