3 回答
TA贡献1798条经验 获得超3个赞
我认为一个好的答案,这个问题应该解释链接什么是。
当您编译一些C代码(例如)时,它将被转换为机器语言。只是一个字节序列,当运行时,会导致处理器添加,减去,比较,“转到”,读取内存,写入内存等等。这些东西存储在对象(.o)文件中。
现在,很久以前,计算机科学家发明了这种“子程序”的东西。执行 - 这 - 块-的代码和回报 - 在这里。不久之后,他们意识到最有用的子程序可以存储在一个特殊的地方,并被需要它们的任何程序使用。
现在,在早期,程序员必须打入这些子程序所在的内存地址。有点像CALL 0x5A62
。如果需要更改那些内存地址,这是繁琐且有问题的。
因此,该过程是自动化的。你编写一个调用的程序,printf()
编译器不知道的内存地址printf
。所以编译器只是写入CALL 0x0000
,并在对象文件中添加一条注释,说“必须将此0x0000替换为printf的内存位置”。
静态链接意味着链接器程序(GNU的一个名为ld)将printf
机器代码直接添加到可执行文件中,并将0x0000更改为地址printf
。创建可执行文件时会发生这种情况。
动态链接意味着上述步骤不会发生。可执行文件仍然有一个注释“必须用printf的内存位置替换0x000”。每次运行程序时,操作系统的加载程序都需要找到printf代码,将其加载到内存中并更正CALL地址。
程序调用一些静态链接的函数(标准库函数,如printf
通常是静态链接的)和其他动态链接的函数是很常见的。静态的“成为可执行文件的一部分”,动态的“加入”可执行文件运行时。
这两种方法都有优点和缺点,操作系统之间也存在差异。但既然你没有问,我会在这里结束。
TA贡献1794条经验 获得超7个赞
静态链接库在编译时链接。动态链接库在运行时加载。静态链接将库位烘焙到您的可执行文件中。动态链接仅烘焙对库的引用; 动态库的位存在于别处,可以在以后换出。
- 3 回答
- 0 关注
- 1953 浏览
添加回答
举报