Linux下共享库的建立

大多数LINUX程序都使用共享库。如果你感觉不到的话,大多数的C程序要用到的共享库libc.so.X,其中X是版本号。

1、检查程序的共享库

用ldd程序可以查询可执行程序所需要的共享库。下面是对一个用gcc2.96编译器编译的一般C程序做的查询(该程序使用的是ELF二进制格式):

ldd a.out

libc.so.6 => /lib/libc.so.6 (0x4003a000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

2、建立共享库

用ELF建立应用程序的共享库是比较容易的,下面以一个简单的例子来说明:

/*

File: lddemo.c

Demonstrate use of dynamic linking.

*/

#include

#include
/* demo Data structure */

typede tagUSERINFO {

char *name;

int age;

}USERINFO;

typedef USERINFO* PUSERINFO;
void* Init(char *name)

{

PUSERINFO pUserInfo = (PUSERINFO)calloc(1, sizeof(USERINFO));

if( name ) pUserInfo->name = malloc(strlen(name) 1);

strcpy( pUserInfo->name, name );

printf("created: %sn", name);

return pUserInfo;

}
void Show(void *pVar)

{

PUSERINFO pUserInfo = ( PUSERINFO )pVar;

printf( "Show: %sn", pUserInfo->name );

}
void Free(void *pVar)

{

PUSERINFO pUserInfo = (PUSERINFO)pVar;

if ( !pUserInfo ) return;

if ( pVar->name ) {

printf( "Free: %sn",pVar->name );

free(pVar->name);

}

free(pVar);

}

该文件中有三个函数:

Init: 分配必要的存储空间,初始化数据

Show: 显示数据

Free: 释放所有的存储空间
以下是建立共享库libddemo.so的具体过程:
a、用-fPIC选项编译所有的源文件,本例只有lddemo.c

$ gcc -fIPC -c lddemo.c
b、用-share选项将目标连成共享库,并为连接器提供合适的连接选项。为建立libddemo.so.1共享库,使用如下命令:

$ gcc -shared -Wl,-soname,libddemo.so.1 -o libddemo.so.1.0 lddemo.o
c、建立一系列的符号链接,以便使用共享库的程序根据标准名来引用它,对于示例,其标准名为libddemo.so,可以用ln建立符号链接:

$ ln -s libddemo.so.1.0 libddemo.so.1

$ ln -s libddemo.so.1 libddemo.so
d、测试共享库时,用下列命令定义和输出LD_LIBRARY_PATH环境变量:

$ export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH

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

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