学习下Linux中的库

  soname
  形式一般为lib.so.,以symbol link的方式存在于文件系统中,version的不同反映了接口的改变,其指向的实际文件的名字通常是在soname后加上..。

  ldd/ldconfig
  一个程序/shared库一般都要依赖其他的一些库,这可以用ldd来查看,它列出了依赖的库的soname,因为实际依赖是库的接口,而soname正是反映了库的接口信息。linux使用ELF作为可执行程序和库的格式,这些依赖的库的soname保存在ELF的某个fileld里。当一个可执行程序执行时,ld.so负责把它所依赖的shared库加载到内存并链接,它按照以下顺序寻找shared库:

  在LD_LIBRARY_PATH环境变量指定的目录下
  ld.so.cache文件该shared库对应的文件
  /usr/lib和/lib目录下

  ldconfig 建立或更新soname,并把其对应关系写入缓存文件ld.so.cache以加快加载速度,ld.so将主要使用这个ld.so.cache来寻找库文件,所以当拷贝shared库到一个不是/usr/lib和/lib的目录后,要运行ldconfig更新ld.so.cache以使ld.so能找到这个shared库。ldconfig能够建立和更新soname是因为ELF文件有一个field保存了其对应的soname。

  ld
  ld是GNU linker,是创建一个可执行程序/库最后一步使用的工具。

  -shared
  创建一个shared library

  -L
  ld在一个目录列表里搜索要连接的archive文件,该选项添加指定目录到缺省目录列表的前面。缺省目录列表依赖ld使用的模拟模式,gcc里有个选项-print-search-dirs可以列出当前系统的缺省目录列表。

  -l
  添加文件到要连接的archive文件列表。ld将在搜索archive的目录列表里搜索libarchive.so文件,如果不存在则使用libarchive.a文件

  -rpath-link
  当用ld创建一个静态可执行程序(non-shared, non-relocatable,不依赖其他shared library独立运行)时,其输入的shared library(直接依赖)可能又依赖另外的shared library,如果不把这种间接依赖的shared library也包括到静态可执行程序里,其结果就不能独立运行。这个option指定了搜寻这种required shared library的路径,不过ld并不只是在该option指定的路径搜索,具体ld搜索required shared library的各个位置和顺序在man里有详细的说明。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzwdyd.html