【发布时间】:2017-10-25 20:59:17
【问题描述】:
我试图了解 .net 框架架构,但遇到了“可重新定位的机器代码”和“绝对机器代码”这两个术语。据说源代码在编译时被转换为可重定位机器码,而这种可重定位机器码在加载时被转换为绝对机器码。 这是否意味着可重新定位的机器代码只不过是一个程序集?那么什么是绝对机器码呢?什么是加载时间? .net 框架架构中的编译时、加载时和运行时/执行时到底发生了什么?我找不到这些术语的明确区别。
【问题讨论】:
-
它在 .NET 中(几乎)没有任何作用。机器代码是即时生成的,之后永远不会移动。一个相当重要的特性是,抖动和 CLR 可以通过硬编码地址使代码非常高效,而不必担心它们必须进行调整。它对非托管代码很重要,即在一台机器上编译并在另一台机器上执行的那种。此类代码使用必须猜测 DLL 的首选加载地址的链接器。如果该地址空间被占用,那么它必须将代码移动到其他地方,这可能需要修补地址。
标签: .net assembly compilation