2009-12-23 22 views
10

链接和加载动态库是否都在运行时发生? 还是仅在运行时才会加载库?c语言中链接和加载的区别是什么

+0

http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean/311889#311889 – paxdiablo 2009-12-23 09:19:07

+1

这不是一个确切的重复 – 2009-12-26 04:36:23

回答

14

有关静态链接和动态链接之间的区别,请参阅前面的很好的一点。假设你指的是动态链接,那么:

加载和(动态)链接都由链接器完成 - 在linux和其他Unix相似的这是由/lib/ld.so,这是由在几乎所有情况下的操作系统。 ld.so依次将加载将您的应用程序 - mygameBinary写入内存,然后ld.so从文件mygameBinary中读取它需要的动态链接库列表。

接头,ld.so,然后依次加载每个这些库到内存中,例如, libc.so,libpthread.so,libopengl.so,并且看看这些可能需要的其他库libm.so

一旦装载完成,然后开始,寻找在命名对象或它们由一个库或应用程序,和进口导出由另一个库或应用程序功能的方法。然后链接器更改各种引用,有时更新代码以更新每个库中未链接的数据指针和函数调用,以指向实际数据或函数所在的位置。例如,在mygameBinary中调用printf开始时没有指向任何东西(实际上它只是调用链接器),但在链接变为跳转到libc中的printf函数之后。

一旦这种连接完成后,启动应用程序,通过调用mygameBinary_start功能,然后调用main,和你的游戏开始。以这种方式

动态链接是必须支持以下内容:应用程序发布

  • 库更新后,它改变的功能和数据的位置。
  • 单个应用程序在不同版本的操作系统
  • 不确定性,其中库或应用程序可以在存储器
  • 加载通过共享由多个应用程序之间用于图书馆的物理RAM降低芯的大小运行。

一些操作系统的细节有所不同,例如OSX和AIX都将一些库预装入内存中的固定位置。这意味着他们不需要加载,只需链接,这可能会更快。

某些操作系统,如OSX和Linux有时支持预链接,这是一个脚本在启动之前在系统上的应用程序上运行并执行链接的过程。当你启动它们时,你不需要链接它们。这很重要,因为在启动应用程序时,链接会占用大量的计算机时间,并且某些应用程序可能会在一秒钟内多次启动,如在应用程序构建过程中启动gcc,,as,或者在索引计算机数据时过滤脚本(OSX Spotlight)。

6

链接是将一些较小的可执行文件作为单个较大的可执行文件连接在一起的过程。

加载正在执行前将可执行文件加载到内存中。

+1

他问动态库,其中案例链接不是将较小的“可执行文件”包含在较大的文件中的过程。 – tgamblin 2009-12-23 09:06:36

1

两者都发生在动态库的运行时。

首先,加载库以及它们的所有依赖关系(以及这些库的依赖关系等)。然后动态链接器解析加载库中的符号。通常这两个功能都是由同一个软件实现的;在Linux上它是ld.so

静态库中的符号在链接时解析并包含在可执行文件本身中。但是,静态库可能有动态库在运行时满足的未解析符号。

How to Write Shared Libraries中,有关于如何发生这种情况的详细说明,如何对名称进行散列,如何在运行时解析符号的费用等。

3

有两种类型的链接:静态链接和动态链接。

静态链接发生在编译时,因此它在加载程序之前发生。通过静态链接,程序使用的外部符号(例如函数名称)将在编译时解析。

动态链接发生在运行时,所以它发生在加载程序之后或加载时。通过动态链接,符号在加载时或在符号被访问(延迟绑定)时的运行时解析。后者更常见。

-1

Windows和Unix系统对动态库使用完全不同的方法。

Windows DLL未链接。因此,您不能在DLL之间共享静态对象。它就像您地址空间中的一个单独的程序。

Unix共享对象在运行时确实“链接”,就像同一项目的不同模块一样,执行符号解析。

+0

不正确,Windows DLL链接并可共享数据。 – 2009-12-23 12:08:53

+0

nobugz:我建议你查找条目“链接”以及符号分辨率是如何工作的。你会明白为什么没有办法在DLL边界上共享一个静态变量。 – 2009-12-23 13:44:09

-1

动态链接和库加载都在运行时发生,但动态链接在程序执行之前完成并由系统链接器完成。例如,如果所需的库缺失,程序将无法执行。另一方面,图书馆加载是通过程序本身通过dlopen/LoadLibrary函数完成的。在这种情况下,加载过程由应用程序控制,例如可以处理错误。

+0

所以什么时候加载发生然后?它在链接阶段之前(在动态链接的情况下) – Vijay 2009-12-23 11:57:05

+0

在加载的情况下,当程序调用dlopen/LoadLibrary函数时加载库。它可以发生,只要程序员想要;) – 2009-12-23 13:23:07

0

file01.c,file02.c - >产生 - > file01.o,file02.o - >这些.o信息被棍棒化并放入一个动态库中,即lib1.a file11。 c,file12.c - >产生 - > file11.o,file12.o - >这些.o信息被棍棒化并放入单个动态库中,即lib2.a

现在,我有2个最终链接在一起以生成可执行文件的库(如.elf或.mot或.fls)。链接lib1.a和lib2.a中的信息以形成单个可执行文件的过程称为链接。

现在,我需要将其加载到内存中,以便运行它以查看最终可执行文件的行为。将最终可执行文件(如.elf或.mot或.fls)加载到内存中以便运行的过程称为加载。

我希望这会清除链接和加载的重要性(但是定义不合适:-))。

+0

我知道链接和加载过程...我需要的是他们哪一个会先发生,为什么? – Vijay 2009-12-26 05:59:06

+0

这是肯定链接,首先发生......这给了我们最终的可执行文件...然后加载执行...所以先链接,然后加载... 顺便说一下,对于延迟响应抱歉。 .. :-) – wrapperm 2009-12-28 07:26:05

相关问题