动态库加载

Linux共享库两种加载方式简述

浪尽此生 提交于 2020-03-15 19:41:57
动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易。与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是在程序执行时按需载入,其执行代码可以同时在多个程序中共享。由于在编译过程中无法知道动态库函数的地址,所以需要在运行期间查找,这对程 序的性能会有影响。 共享库 对于共享库来讲,它只包括 2 个段:只读的代码段 和可修改的数据段。堆和栈段,只有进程才有。如果你在共享库的函数里,分配了一块内存,这段内存将被算在调用该函数的进程的堆中。代码段由于其内容是对每 个进程都是一样的,所以它在系统中是唯一的,系统只为其分配一块内存,多个进程之间共享。数据段由于其内容对每个进程是不一样的,所以在链接到进程空间 后,系统会为每个进程创建相应的数据段。也就是说如果一个共享库被 N 个进程链接,当这 N 个进程同时运行时,同时共享一个代码段,每个进程拥有一个数据段,系统中共有 N 个数据段。 PIC 即 position independent code, 使 .so 文件的代码段变为真正意义上的共享。如果编译时不加 -fPIC, 则加载 .so 文件的代码段时 , 代码段引用的数据对象需要重定位 , 重定位会修改代码段的内容 , 这就造成每个使用这个 .so 文件代码段的进程在内核里都会生成这个 .so 文件代码段的 copy。 加载方式 1.