链接和加载动态库是否都在运行时发生? 还是仅在运行时才会加载库?c语言中链接和加载的区别是什么
回答
有关静态链接和动态链接之间的区别,请参阅前面的很好的一点。假设你指的是动态链接,那么:
加载和(动态)链接都由链接器完成 - 在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)。
链接是将一些较小的可执行文件作为单个较大的可执行文件连接在一起的过程。
加载正在执行前将可执行文件加载到内存中。
他问动态库,其中案例链接不是将较小的“可执行文件”包含在较大的文件中的过程。 – tgamblin 2009-12-23 09:06:36
两者都发生在动态库的运行时。
首先,加载库以及它们的所有依赖关系(以及这些库的依赖关系等)。然后动态链接器解析加载库中的符号。通常这两个功能都是由同一个软件实现的;在Linux上它是ld.so。
静态库中的符号在链接时解析并包含在可执行文件本身中。但是,静态库可能有动态库在运行时满足的未解析符号。
在How to Write Shared Libraries中,有关于如何发生这种情况的详细说明,如何对名称进行散列,如何在运行时解析符号的费用等。
有两种类型的链接:静态链接和动态链接。
静态链接发生在编译时,因此它在加载程序之前发生。通过静态链接,程序使用的外部符号(例如函数名称)将在编译时解析。
动态链接发生在运行时,所以它发生在加载程序之后或加载时。通过动态链接,符号在加载时或在符号被访问(延迟绑定)时的运行时解析。后者更常见。
Windows和Unix系统对动态库使用完全不同的方法。
Windows DLL未链接。因此,您不能在DLL之间共享静态对象。它就像您地址空间中的一个单独的程序。
Unix共享对象在运行时确实“链接”,就像同一项目的不同模块一样,执行符号解析。
不正确,Windows DLL链接并可共享数据。 – 2009-12-23 12:08:53
nobugz:我建议你查找条目“链接”以及符号分辨率是如何工作的。你会明白为什么没有办法在DLL边界上共享一个静态变量。 – 2009-12-23 13:44:09
动态链接和库加载都在运行时发生,但动态链接在程序执行之前完成并由系统链接器完成。例如,如果所需的库缺失,程序将无法执行。另一方面,图书馆加载是通过程序本身通过dlopen/LoadLibrary函数完成的。在这种情况下,加载过程由应用程序控制,例如可以处理错误。
所以什么时候加载发生然后?它在链接阶段之前(在动态链接的情况下) – Vijay 2009-12-23 11:57:05
在加载的情况下,当程序调用dlopen/LoadLibrary函数时加载库。它可以发生,只要程序员想要;) – 2009-12-23 13:23:07
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)加载到内存中以便运行的过程称为加载。
我希望这会清除链接和加载的重要性(但是定义不合适:-))。
- 1. 动态链接和动态加载有什么区别
- 2. 动态链接器和动态加载器有什么区别?
- 3. C语言中ptr = my_array和ptr =&my_array [0] [0]有什么区别?
- 4. Postgres上的C和Posix语言环境有什么区别?
- 5. 编程语言和脚本语言有什么区别?
- 6. 编程语言的语法和语义有什么区别?
- 7. i = i + j有什么区别;和i + = j;在C语言?
- 8. GCC和LD链接有什么区别?
- 9. 链接和绑定有什么区别?
- 10. 自然语言和编程语言在语法环境中有什么区别?
- 11. Symbian C++和规范C++之间的语法区别是什么?
- 12. 在CKAN中链接到文件和链接到API的区别是什么?
- 13. 什么是直接链接和链接的静态libarary之间的区别
- 14. Racket(lisp编程语言)中的[]和()括号有什么区别?
- 15. 什么区别\\。\ C:和\\。\ C:\
- 16. 什么是ASP.NET和C#的区别?
- 17. 什么语言是c#?
- 18. 链接列表和流之间的技术区别是什么?
- 19. pub/sub和jQuery数据链接的区别是什么?
- 20. Codeigniter系统/语言应用程序/语言有什么区别?
- 21. Ruby语言中“.scan”和“.split”有什么区别?
- 22. Io语言中newSlot和setSlot有什么区别?
- 23. Silverlight 2中DLR语言和C#之间的速度有什么区别?
- 24. C++语言中`::`是做什么的?
- 25. 关注链接和不关注链接有什么区别?
- 26. 静态链接库和动态链接库之间的区别是什么
- 27. 技术区别是什么? &!用迅捷的语言?
- 28. 什么是内容语言和接受语言?
- 29. java语言中if(b)和if(b == true)之间的区别是什么?
- 30. printf中%c和%C有什么区别?
http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean/311889#311889 – paxdiablo 2009-12-23 09:19:07
这不是一个确切的重复 – 2009-12-26 04:36:23