Ale*_*own 18
请参阅前面关于静态链接和动态链接之间区别的非常好的观点.假设您指的是动态链接,那么:
加载和(动态)链接都是由链接器完成的 - 在Linux和其他类似的Unix上完成/lib/ld.so
,这是由操作系统在几乎所有情况下启动的实际程序. ld.so
反过来将您的应用程序加载mygameBinary
到内存中,ld.so
然后从文件中读取mygameBinary
它所需的动态链接库列表.
链接器,ld.so
,然后加载这些库到内存反过来,例如libc.so
,libpthread.so
,libopengl.so
,和看什么其他图书馆这些可能需要,例如libm.so
.
一旦加载完成,然后连接开始,看着它被命名为对象或函数的过程导出一个库或应用程序,以及进口的其他库或应用程序.然后,链接器更改各种引用,有时还会更新代码以更新每个库中的未链接数据指针和函数调用,以指向实际数据或函数所在的位置.例如,对printf
in 的调用mygameBinary
开始时指向任何内容(实际上它只是调用链接器),但是在链接之后变为跳转到printf
函数中libc
.
一旦完成此链接,就会启动应用程序,方法是调用_start
函数mygameBinary
,然后调用main
,然后开始游戏.
以这种方式动态链接是必要的,以支持以下内容:
某些操作系统的细节不同,例如OSX和AIX都将某组库预先加载到内存中的固定位置.这意味着它们不需要加载,只需链接,这可能更快.
某些操作系统(如OSX,有时还支持Linux)支持预链接,这是一个脚本在启动它们之前在系统上的应用程序上运行并进行链接的过程.启动它们时,您无需链接它们.这很重要,因为联需要,当你启动应用了大量的计算机的时间,和一些应用程序可能会推出多次第二,如gcc
,cpp
和as
在应用程序的构建过程,或过滤器脚本索引你的计算机的数据时(OSX焦点).
小智 5
链接有两种类型:静态链接和动态链接。
静态链接发生在编译时,因此它发生在加载程序之前。通过静态链接,程序使用的外部符号(例如函数名称)将在编译时解析。
动态链接发生在运行时,因此它发生在程序加载之后或加载时。通过动态链接,符号可以在加载时解析,也可以在运行时访问符号时解析(惰性绑定)。后者更为常见。