【问题标题】:What is dynamic linker in programming?什么是编程中的动态链接器?
【发布时间】:2013-10-13 23:54:30
【问题描述】:

我对链接器概念感到困惑

  1. 我们可以在 java 中使用链接器吗?
  2. 如果是这样,如何在 android 开发 中进行链接?

【问题讨论】:

  • 链接器是一种应用程序,它获取已编译的目标文件(由编译器发出)并使用它们来构建“链接”到其必要库的可执行文件。与 Java 中的链接最接近的是 classloader...
  • @pinny-->这个类加载器负责可执行文件吗?
  • 在 Java 中,您不会得到标准意义上的可执行文件。只是一堆字节码编译对象(“jars”),其中至少一个将提供 JVM 可以调用的入口点。因此,链接器的主要功能并不是真正需要的。类加载器在运行时帮助 JVM 将必要的对象拉到一起以供执行。
  • @PinnyM-->感谢您的努力。
  • 这个问题有点令人困惑且没有描述性。链接器是一个编译器阶段系统,它在“Java 开发”本身下做一些事情。您在“在 Java 中使用链接器”的实际意思是什么? Java 编译器使用链接器,但我不确定开发人员是否应该担心这一点。这可能会使学习者或 Java 新手更加困惑。

标签: java android c++ c operating-system


【解决方案1】:

linker 是一个程序,它获取单独的已编译文件并将它们组合成一个可执行程序。

假设您有一个包含两个文件的程序:一个具有启动程序的 main 函数,另一个定义了一个辅助函数。当编译器在主文件上工作时,它会生成调用辅助函数的代码,而实际上并不知道它是否存在或它做了什么。然后链接器接管并“解析”函数调用,以便在程序运行时输入正确的函数。

基本上有两种类型的链接器:

  • 静态链接器在执行前运行,生成一个完全链接的可执行文件作为输出,可以加载和运行。
  • dynamic linker 在执行可执行文件时运行,在不同的库中查找所需的符号。

通常,链接器概念仅适用于操作系统级别的本机代码。如果你想将它应用到 Java,你可以说它只使用动态链接;链接器已集成到 JVM 中。

【讨论】:

    【解决方案2】:

    与 C/C++ 不同,链接步骤在 Java 中通过 JVM(懒惰或急切地)处理 @runtime。所以没有像Java链接器这样的东西。 JVM 会处理它。

    在 Android 中,在 Lollipop 之前,JVM 负责进行链接。在 AOT 出现后(提前编译),那些东西开始接近 C/C++ 的方式。这意味着,在运行应用程序之前完成编译和链接。

    【讨论】:

      【解决方案3】:

      linker 是一种计算机程序,它采用编译器生成的一个或多个目标文件并将它们组合成一个可执行程序。计算机程序通常包括几个部分或模块;这些部分/模块不必全部包含在单个目标文件中,并且在这种情况下通过符号相互引用。当一个程序包含多个目标文件时,链接器会将这些文件组合成一个统一的可执行程序,同时解析符号。

      许多操作系统环境允许动态链接,即推迟解析某些未定义符号,直到程序运行。这意味着可执行代码仍然包含未定义的符号,以及将为这些符号提供定义的对象或库的列表。加载程序也将加载这些对象/库,并执行最终链接。动态链接不需要链接器。

      “链接器”在 java 世界中没有意义。 classloader 的概念 - 给定一个 java 字节码数组,可以创建一个 Class 的内部表示,这在之前是正确的。现在 Java 9 有 Linker

      【讨论】:

        【解决方案4】:

        当 Java 编译器运行时,它会为程序中的每个类或接口生成一个单独的字节码文件(扩展名为 *.class)。这些文件与 Java API 的类文件相互建立符号连接。

        在运行时,Java 虚拟机加载程序文件并将它们组合到一个称为动态链接的过程中。

        【讨论】:

          猜你喜欢
          • 2017-09-30
          • 2010-09-23
          • 2015-08-26
          • 1970-01-01
          • 2011-05-14
          • 2011-04-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多