加载时间链接是指当操作系统将可执行文件/库加载到内存时,由可执行文件(或另一个库)引用的库中的符号被处理.
运行时链接是指当您使用操作系统提供的API或通过库在需要时加载DLL或DSO,然后执行符号解析.
我比Windows DLL更了解Linux DSO,但原则应该是一样的. .NET库可能不同.
在linux中,插件架构是这样完成的.您的程序将使用运行时链接加载库并调用某些功能.然后可能卸载它.它还允许导出加载相同符号的多个库,而不会发生冲突.我认为DLL将以相同的方式工作.
可执行文件在其符号表中具有需要由某个库填充的“空格”.这些空格通常是在加载时或编译时填写的.您可以通过使用运行时链接来否定符号表中“空格”的需要.
运行时链接有用的另一个场景是调试库,或者在运行时从多个ABI / API兼容的库中进行选择.我经常有一个图书馆,说“foo”和一个叫“foo_unstable”,并有一个测试应用程序在2之间切换并进行一些测试.
在linux下,要查看可执行程序链接到哪个库,请执行ldd命令并获取输出(on / bin / ls):
linux-vdso.so.1 => (0x00007fff139ff000) librt.so.1 => /lib64/librt.so.1 (0x0000003c4f200000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003c4fa00000) libcap.so.2 => /lib64/libcap.so.2 (0x0000003c53a00000) libacl.so.1 => /lib64/libacl.so.1 (0x0000003c58e0000
操作系统将尝试在加载时加载库(.so文件).它可能已经有内存库.