【问题标题】:Why can't you combine a DLL with an EXE, as if it had been statically linked?为什么不能像静态链接一样将 DLL 与 EXE 结合起来?
【发布时间】:2011-06-06 06:58:48
【问题描述】:

为什么不能*将本机共享库 (DLL) “重新链接”到可执行文件中,就好像它们已被静态链接一样? DLL 是否缺少任何必需的信息?

*注意:或者它实际上是可能的?如果是,请告诉我,但通过搜索我得出的结论是这是不可能的。

【问题讨论】:

  • 检查 DLL 到 lib,在此线程的答案中:stackoverflow.com/questions/424032/how-to-link-a-dll-statically
  • 这不是一般可以解决的问题,因为EXE可能依赖动态加载,通过DLL的HMODULE和函数名获取函数地址等。
  • @Pablo:有趣,我会看看,谢谢。 @Damien_The_Unbeliever:为了这个问题,请假设 exe 没有明确地依赖于这个事实。 :)

标签: linker shared-libraries executable static-libraries


【解决方案1】:

这是不可能的。

当一个 EXE 加载一个 DLL(通过LoadLibrary)时,DLL 加载器会完成大量的工作来修补地址。您不能只是将 DLL 原样与 exe 结合起来,因为如果它不是动态地,它的地址是错误的> 已加载。

另一方面,LIB 是静态链接的:不涉及加载,不固定地址,当您启动程序时,一切都可以正常工作。

可以做的是将DLL和EXE转换回OBJ并将它们静态链接在一起。

【讨论】:

  • @Heandel:你有没有偶然看到我对@Damien 的回复评论?
  • @Heandel:是的,我知道你所说的一切都是动态的,但如果你没有明确地调用LoadLibrary,这不是有点不同吗?在这种情况下,可执行文件应该(相对)容易修改,以允许导入 thunk 直接调用嵌入式库,不是吗?
  • @Heandel:另外,如何将 DLL 或 EXE 转换回 OBJ?是不是遗漏了一些信息?
  • @Heandel:嗯...当我尝试使用 NDISASM/NASM 执行此操作时,我得到:error: Win32 COFF does not correctly support relative references to absolute addresses...你确定这是可能的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2013-04-03
  • 1970-01-01
相关资源
最近更新 更多