动态库的自作详情
共享库的创建比较简单,基本有两步。首先使用-fPIC或-fpic创建目标文件,PIC或
pic表示位置无关代码,然后就可以使用以下格式创建共享库了: gcc -share -Wl,-
soname,your_soname -o library_name file_list library_list 下面是使用a.c和创建库
PIC:位置无关码->使用的都是相对地址
gcc -fPIC -c add.c
按照共享库的命名惯例,每个共享库有三个文件名:real name、soname和linker
name。真正的库文件(而不是符号链接)的名字是real name,包含完整的共享库版本号。
soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函
数的接口一致,因此应用程序的.dynamic段只记录共享库的soname,只要soname一致,这个
共享库就可以用。如libadd.so.1和libadd.so.2是两个主版本号不同的libadd,有些应
用程序依赖于libadd.so.1,有些应用程序依赖于libadd.so.2,但对于依赖libadd.so.1
的应用程序来说,真正的库文件不管是libadd.so.1.10还是libadd.so.1.11都可以用,所
以使用共享库可以很方便地升级库文件而不需要重新编译应用程序,这是静态库所没有的优
点。注意libc的版本编号有一点特殊,libc-2.8.90.so的主版本号是6而不是2或2.8。
库的加载
所 有 基 于 GNUglibc 的 系 统 中, 在 启 动 一 个 ELF 二 进 制 执 行 程 序 时, 一 个 特 殊 的
程序“程序装载器”会被自动装载并运行。在linux中,这个程序装载器就是/lib/ld-
linux.so.X(X是版本号)。它会查找并装载应用程序所依赖的所有共享库。被搜索的目录保存在/etc/ld.so.conf文件中。
当然,如果程序的每次启动,都要去搜索一番,势必效率不
堪忍受。Linux系统已经考虑这一点,对共享库采用了缓存管理。ldconfig就是实现这一功
能的工具,其缺省读取/etc/ld.so.conf文件,对所有共享库按照一定规范建立符号连接,
然后将信息写入/etc/ld.so.cache。 /etc/ld.so.cache的存在大大加快了程序的启动速
度。
实例:
add.h
#ifndef _ADD_H_
#define _ADD_H_
int add(int,int);
#endif // _ADD_H_
add.c
#include "add.h"
int add(int a,int b)
{
return a+b;
}
main.c
#include <stdio.h>
#include "add.h"
int main()
{
int a= add(10,20);
printf("%d\n",a);
return 0;
}
第一步先编译生成add.o
gcc -fPIC -c add.c
第二步生成库libadd.so.1.0.1
gcc -shared -Wl,-soname,libadd.so.1 -o libadd.so.1.0.1 add.o1. 修改/etc/ld.so.conf
第三步修改库配置文件
sudo vi /etc/ld.so.conf
添加你的共享库路径
第四步更新查找共享库的路径
sudo ldconfig -v
此时可以看到自动创建出来了,so name libadd.so.1
第五步手动添加link name
ln -s libadd.so.1.10 libadd.so
然后尽情你就可以尽情的去使用就好了