大多数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
Linux下共享库的建立
内容版权声明:除非注明,否则皆为本站原创文章。