【发布时间】: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