我对链接器概念感到困惑
- 我们可以在java中使用链接器吗?
- 如果是这样,在android开发中如何发生链接?
链接器是一个程序,它获取单独的编译文件并将它们组合成一个可执行程序。
假设您有一个包含两个文件的程序:一个具有启动程序的 main 函数,另一个定义了一个辅助函数。当编译器在主文件上工作时,它会生成调用辅助函数的代码,而实际上并不知道它是否存在或它做了什么。然后链接器接管并“解析”函数调用,以便在程序运行时输入正确的函数。
基本上有两种类型的链接器:
通常,链接器概念仅适用于操作系统级别的本机代码。如果你想将它应用到 Java,你可以说它只使用动态链接;链接器集成到 JVM 中。
链接器是一种计算机程序,它采用编译器生成的一个或多个目标文件并将它们组合成一个可执行程序。计算机程序通常包括几个部分或模块;这些部分/模块不必全部包含在单个目标文件中,并且在这种情况下通过符号相互引用。当一个程序包含多个目标文件时,链接器会将这些文件组合成一个统一的可执行程序,同时解析符号。
许多操作系统环境允许动态链接,即推迟对某些未定义符号的解析,直到程序运行。这意味着可执行代码仍然包含未定义的符号,以及将为这些符号提供定义的对象或库的列表。加载程序也将加载这些对象/库,并执行最终链接。动态链接不需要链接器。
“链接器”在 Java 世界中没有意义。类加载器的概念——给定一个 java 字节码数组,可以创建一个类的内部表示,这在之前是正确的。现在 Java 9 有了 Linker
与 C/C++ 不同,链接步骤通过 JVM 在 Java 中(懒惰或急切地)处理 @runtime。所以没有像Java链接器这样的东西。JVM 负责处理它。
在 Android 中,在 Lollipop 之前,JVM 负责进行链接。在 AOT 出现(提前编译)之后,那些东西开始接近 C/C++ 的方式。这意味着,在运行应用程序之前完成编译和链接。
当 Java 编译器运行时,它会为程序中的每个类或接口生成一个单独的字节码文件(扩展名为 *.class)。这些文件与 Java API 的类文件相互建立符号连接。
在运行时,Java 虚拟机加载程序文件并将它们组合在一个称为动态链接的过程中。