Linux共享库简单总结】的更多相关文章

库 静态库 编译的二进制会重新包含一份静态库的副本 共享库 编译 gcc -shared -o file.c -fPIC 链接 ld ld-linux.so.2 可执行程序–>动态依赖表 流程:程序运行–>加载ld-linux.so.2–>搜索动态库路径寻–>路径下根据动态链接表搜索动态库 –> 搜索相应符号链接加载至内存执行 符号链接覆盖:简单的说是两个同名的函数具有相同的符号链接则会绑定第一次搜索到的符号链接函数 程序运行时搜索到共享库的三种方法 LD_PATH /lib…
  Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是在程序执行时按需载入,其执行代码可以同时在多个程序中共享.由于在编译过程中无法知道动态库函数的地址,所以需要在运行期间查找,这对程 序的性能会有影响. 共享库 对于共享库来讲,它只包括2个段:只读的代码段 和可修改的数据段.堆和栈段,只有进程才有.如果你在共享库的函数里,分配了一块内存,这段内存将被…
前几天看到一篇介绍linux共享库版本控制及使用的文章,觉得不错,这里就与大家分享一下. 1. Linux约定 经常看到Linux中,共享库的名字后面跟了一串数字,比如:libperl.so.5.18.2.其实就是版本号,作用是为了更加方便的管理动态库,比如升级.往往系统中存在一个库的多个版本,那么Linux 系统如何控制多个版本的问题?Window之前没有处理好,为此专门有个名词来形容这个问题:“Dll hell”,其严重影响软件的升级和维护.“Dll hell”是指windows上动态库的新…
linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有一些更新,增加了一些接口符号且保持原来的接口符号不变,但保持后向兼容:主版本号和次版本号相同,发布版本号不同,表示库的一些修改修正,不增加新功能. SO-NAME软链接 SO-NAME 软链接:共享库 libname.so.x.y.z 的SO-NAME软链接命名为 libname.so.x 即去掉次…
参考: 1. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径.(该路径在默认路径之前查找) 移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时可以将这些目录设置到LD_LIBRARY_PATH中. 当执行函数动态链接.so时,如果此文件不在缺省目录下‘/usr/local/lib’ and ‘/usr/lib’. 那么就需要指…
参考自: <<程序员的自我修养--链接.装载与库>> 第八章 Linux共享库的组织 以下截取部分内容 (这本书比较好的讲解了从程序的链接,装载,到运行) 共享库的兼容性 linux下的共享库就是普通的ELF共享对象 更改类型 兼容性 往共享库 Hbfoo.so里面添加一个导出符号 foo2 兼容 删除共享库libfoo.so里面一个原有的导出符号 foo 不兼容 将libfoo.so给一个导出函数加一个参数,比如原来的foo(int a)变成了foo(int a,int b) 不…
1. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用.程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级. 程序函数库可分为3种类型:静态函数库(static libraries).共享函数库(shared libraries).动态加载函数库(dynamically loaded libraries): 1.静态函数库,是在程序执行前就加入到目…
so文件在linux中为共享库,与windows下的dll类似. so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用. 共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性的时候,用户只需要获得升级后的so并安装他就可以. 注意:即使不同的进程调用同一个so文件,通过共享库并不能实现不同进程间的通讯,因为同一个so被不同进程加载到不同的内存空间. so文件编译方法 --so文件的源文件中不需要main函数,即使有也不会被执行. --编译的时候gcc需要加-fPIC选项…
Linux 系统上有两类根本不同的 Linux 可执行程序.第一类是静态链接的可执行程序.静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”.因为这一原因,静态可执行程序不依赖任何外部库就可以运行. 第二类是动态链接的可执行程序. 静态可执行程序与动态可执行程序比较 我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的: # ldd /sbin/sln not a dynamic executable “not a dynamic executable”是 ldd…
mylog.h #ifdef __cplusplus extern "C" { #endif //写日志函数 //path:日志文件名 //msg:日志信息 int writelog(const char *path, const char * msg); #ifdef __cplusplus } #endif mylog.c //日志共享库 #include <stdio.h> #include <stdlib.h> #include <string.h…