Linker 为什么可以';你不能把DLL和EXE结合起来,就好像它是静态链接的一样吗?

Linker 为什么可以';你不能把DLL和EXE结合起来,就好像它是静态链接的一样吗?,linker,shared-libraries,executable,static-libraries,Linker,Shared Libraries,Executable,Static Libraries,为什么不可能*将本机共享库(DLL)重新链接到可执行文件中,就好像它们是静态链接的一样?DLL是否缺少任何必需的信息 *注:或者它实际上是可能的?如果是,请让我知道,但通过搜索我得出结论,这是不可能的。这不是直接可能的 当一个EXE加载一个DLL时(通过LoadLibrary),DLL加载程序要做很多工作来修补地址。不能将DLL按原样与exe组合,因为如果未动态加载,则其地址是错误的 另一方面,LIB是静态链接的:不需要加载,不需要地址修复,在启动程序时,一切都可以正常工作,无需进一步的作业 可

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


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

这不是直接可能的

当一个EXE加载一个DLL时(通过
LoadLibrary
),DLL加载程序要做很多工作来修补地址。不能将DLL按原样与exe组合,因为如果未动态加载,则其地址是错误的

另一方面,LIB是静态链接的:不需要加载,不需要地址修复,在启动程序时,一切都可以正常工作,无需进一步的作业


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

检查DLL到lib,这是该线程的一个答案:这不是一个通常可以解决的问题,因为EXE可能依赖于动态加载,通过DLL的HMODULE和函数名获取函数地址,等等。@Pablo:有趣,我来看看它,谢谢@Damien_The_异教者:为了这个问题,请假设exe没有明确地依赖于这个事实为真@希恩德尔:你有没有碰巧读过我对@Damien的回复评论?@希恩德尔:是的,我知道你所说的一切都是动态的,但是如果你没有明确调用
LoadLibrary
,这不是有点不同吗?在这种情况下,可执行文件应该(相对)易于修改,以允许导入thunks直接调用嵌入式库,否?@Heandel:另外,如何将DLL或EXE转换回OBJ?是不是遗漏了一些信息?@Heandel:Hm。。。当我尝试使用ndisam/NASM这样做时,我得到:
错误:Win32 COFF不正确地支持对绝对地址的相对引用
。。。你确定这是可能的吗?