为了账号安全,请及时绑定邮箱和手机立即绑定

“静态链接”和“动态链接”是什么意思?

“静态链接”和“动态链接”是什么意思?

慕桂英546537 2019-07-31 14:11:16
“静态链接”和“动态链接”是什么意思?我经常听到“静态链接”和“动态链接”这两个术语,通常用C,C ++或C#编写的代码。他们是什么,他们到底在说什么,他们连接的是什么?
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

我认为一个好的答案,这个问题应该解释链接什么

当您编译一些C代码(例如)时,它将被转换为机器语言。只是一个字节序列,当运行时,会导致处理器添加,减去,比较,“转到”,读取内存,写入内存等等。这些东西存储在对象(.o)文件中。

现在,很久以前,计算机科学家发明了这种“子程序”的东西。执行 - 这 - 块-的代码和回报 - 在这里。不久之后,他们意识到最有用的子程序可以存储在一个特殊的地方,并被需要它们的任何程序使用。

现在,在早期,程序员必须打入这些子程序所在的内存地址。有点像CALL 0x5A62。如果需要更改那些内存地址,这是繁琐且有问题的。

因此,该过程是自动化的。你编写一个调用的程序,printf()编译器不知道的内存地址printf。所以编译器只是写入CALL 0x0000,并在对象文件中添加一条注释,说“必须将此0x0000替换为printf的内存位置”。

静态链接意味着链接器程序(GNU的一个名为ld)将printf机器代码直接添加到可执行文件中,并将0x0000更改为地址printf。创建可执行文件时会发生这种情况。

动态链接意味着上述步骤不会发生。可执行文件仍然有一个注释“必须用printf的内存位置替换0x000”。每次运行程序时,操作系统的加载程序都需要找到printf代码,将其加载到内存中并更正CALL地址。

程序调用一些静态链接的函数(标准库函数,如printf通常是静态链接的)和其他动态链接的函数是很常见的。静态的“成为可执行文件的一部分”,动态的“加入”可执行文件运行时。

这两种方法都有优点和缺点,操作系统之间也存在差异。但既然你没有问,我会在这里结束。


查看完整回答
反对 回复 2019-07-31
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

静态链接库在编译时链接。动态链接库在运行时加载。静态链接将库位烘焙到您的可执行文件中。动态链接仅烘焙对库的引用; 动态库的位存在于别处,可以在以后换出。


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 1953 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信