【问题标题】:Partially Linked to Dynamic Linking in C部分链接到 C 中的动态链接
【发布时间】:2018-11-08 06:37:47
【问题描述】:

我还在努力理解动态链接和静态链接的核心区别,下面是我教科书中的图片和示例代码:

/* main2.c */
 #include <stdio.h>
 #include "vector.h"

 int x[2] = {1, 2};
 int y[2] = {3, 4};
 int z[2];

 int main()
 {
   addvec(x, y, z, 2);
   printf("z = [%d %d]\n", z[0], z[1]);
   return 0;
 }

而 libvector.so 只是一个提供 main2.c 所需定义的 DLL

所以我的问题是:

为什么 p2 是“部分链接的可执行目标文件”?既然叫“部分链接”,那肯定是做了一些静态链接。但由于此时 libvector.so 或 libc.so 中的任何代码或数据部分都没有实际复制到可执行文件 p2 中。那么为什么 p2 仍然“部分链接”?静态链接不就是从objects文件中复制代码和数据部分,如果没有复制,那么就没有涉及到静态链接吗?

【问题讨论】:

  • 这两个目标文件已被合并到可执行文件中,以及关于它们调用的函数的信息,这些信息可能由共享对象提供。大多数人会调用p2 和可执行文件,并将“部分链接”排除在等式之外。我想与动态加载器(链接器)完成后运行的内容相比,它只是部分链接,但这与大多数人无关。
  • 部分链接的可执行文件本身只有一个目标文件 (main.o)
  • @AnttiHaapala:好的——应该开始“目标文件有”……许多(大多数?)程序有多个目标文件(尽管“超过一个”通常意味着“超过两个” ,也是)。

标签: c linker dynamic-linking


【解决方案1】:

部分链接的可执行文件将所有 .o 目标文件(这里只有main.o)链接在一起,并可能链接存根、重定位表等以促进动态链接。动态链接器仅在运行程序之前执行剩余的“n %”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多