【问题标题】:Do dll's ever turn into machine code?dll是否曾经变成机器代码?
【发布时间】:2010-06-03 22:20:16
【问题描述】:

只是好奇,有人告诉我,使用 dll 文件,您可以对 dll 进行修改,而无需重新编译使用它的整个应用程序。另一方面,需要编译 .lib 文件,以便代码可以作为一个链接到应用程序。

所以我知道 .lib 文件已转换为机器代码。但是dll呢?它们是否在应用程序执行时变成机器代码??

如果使用不当,这可能会导致黑客入侵。

【问题讨论】:

  • 尝试objdump -x somefile.dll > dllinfo.txt 并阅读 dllinfo.txt 以检查 DLL 的内容
  • 我不会担心这种方式“黑客攻击” - 您可以像替换 dll 一样轻松替换可执行文件。无论哪种方式,您都需要获得许可才能将任意代码复制到机器上并让用户运行它。很确定MS已经想到了这个:)
  • 如果您认为运行代码的人可以更改代码是个问题,您最好修复所有安全性依赖于该假设的代码...
  • @all 答案:也有 DLL包含“机器代码”。例如。仅包含资源部分的 DLL。
  • @Pindatjuh,仅资源 DLL 不仅是可能的,而且它们实际上相当普遍。例如,在 Windows 世界中,这是实现国际化的一种简单方法,因为可以让 UI 中可见的所有文本都来自资源。

标签: c++ c visual-studio visual-studio-2008


【解决方案1】:

dll 仍然是机器码。它们只是在运行时动态链接(因此命名)所以(如果您不更改函数签名)您不必重新编译主程序以在更改后使用 dll。静态库实际上是可执行文件的一部分,这就是为什么那里的更改需要重新编译(或者实际上是重新链接)。

【讨论】:

    【解决方案2】:

    DLLs 包含已编译的机器代码。不同之处在于应用程序 EXE 和 DLL 之间的链接是在运行时完成的,而不是在 OBJ 和 LIB 文件之间的(传统)链接时完成的。

    【讨论】:

      【解决方案3】:

      DLL 通常包含机器代码。重点不是你可以修改DLL,因为它是源代码,而是你可以修改源代码for DLL,重新编译和重新链接,只要接口仍然存在同样,您可以用新的 DLL 替换旧的 DLL,应用程序的其余部分可以使用新的而不是旧的。

      实际上,这经常会导致问题,例如包含依赖旧 DLL 中的错误的代码的应用程序。当/如果您创建修复错误的版本时,它会破坏应用程序。更多示例请在 Google 中搜索“DLL Hell”。

      【讨论】:

      • 你比我快!我想添加有关“DLL Hell”问题和解决方法的信息。引入接口、COM 和一些 .NET 范例的主要原因之一是解决“DLL Hells”问题的不同方法。
      【解决方案4】:

      简单地说:DLL 可以在编译后换出,因为它们在物理上与您的 exe 是分开的。另一方面,Lib 和 obj 文件是 编译到您的 exe 中,以便更新它们 需要重新编译您的应用程序。

      Dll 实际上是没有定义 main() 的 exe。

      【讨论】:

        【解决方案5】:

        当 DLL 链接到主程序时,只有它导出的接口(即类、函数等)通过其签名链接。 DLL 中的实际机器代码仅在运行时加载,而不是在编译时加载;这就是为什么您可以只使用 DLL 的 lib 构建您的应用程序,并将实际的 DLL 放在您希望拥有它的位置(例如一些共享的 DLL 文件夹或其他)。

        然后您可以将该 DLL 替换为具有相同接口的任何其他 DLL。这就是插件系统通常的工作方式,因为每个插件只是一个符合文档化预定义接口的 DLL,程序只是加载它在某个“插件”目录中找到的该接口的所有 DLL。

        这里(可能)令人困惑的部分是实际上有两种 .lib 文件:

        a) 静态链接库。它们将所有编译后的代码直接放入主应用程序,并且是生成的 .exe 文件的固定部分。

        b) 用于动态链接的库。它们包含一个包含实际代码的 DLL 接口,该接口必须仅在运行时对应用程序可用(如果不是,它将不会启动,并简单地告诉您它找不到哪个 DLL)。

        顺便说一句:您不必指定链接到的库之一是什么类型,它会自动执行。

        另外:一些应用程序是作为 DLL 构建的,旨在在某些外部环境中运行。例如,Web 服务被实现为具有特定接口的 DLL,由 Apache/IISAPI/任何服务器运行。这与前面提到的插件系统类似,但这里每个 DLL 实际上应用程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-12
          • 1970-01-01
          • 2010-10-27
          • 1970-01-01
          • 2019-03-05
          • 1970-01-01
          • 2011-09-29
          • 2011-10-26
          相关资源
          最近更新 更多