动态库的自作详情

共享库的创建比较简单,基本有两步。首先使用-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

然后尽情你就可以尽情的去使用就好了

posted on 2017-03-29 15:23  甚至痴迷  阅读(139)  评论(0编辑  收藏  举报

导航