http://blog.itpub.net/283313/viewspace-2139257/
unix平台下,动态连接库的使用有两种方式,link方式和dlopen方式。需要设置LD_LIBRARY_PATH作为查找路径(低版本AIX使用LIBPATH)。link方式是程序启动时加载所有编译时连接的动态库,直到程序结束也不会关闭。dlopen方式是在运行中按照参数指定的方式加载动态库,并可以使用dlclose函数关闭,直到下次再使用dlopen重新加载。因此,link方式无法做到不重启应用程序而更新动态库版本,dlopen方式可以。
各平台动态连接库的编译参数如下。文件wel.c,编译成libwel.so(HPUX为libwel.sl)。
- #include <stdio.h>
- void welcome(void)
- {
- puts("welcome,baby!");
- }
linux:
编译libwel.so:
gcc -fPIC -shared -o libwel.so wel.c -lc
-fPIC 用相对地址定位
-shared 生成动态连接库
sco unix open server:
编译libwel.so:
cc -K PIC -G -o libwel.so wel.c -lc
-K PIC 用相对地址定位
-G 生成动态连接库,包含了-b elf选项
AIX:
编译libwel.so:
xlc -G -bnoentry -o libwel.so wel.c -lc
-G 指定生成动态连接库
-bnoentry 动态库无需模块入口(低版本AIX需要此参数)
HP UX:
编译libwel.so:
cc +z -c wel.c
ld -b -o libwel.sl wel.o -lc
+z 用相对地址定位
-b 生成动态连接库
SUN OS: 很类似SCO,man帮助不全面
编译libwel.so:
cc -G -o libwel.so wel.c -lc
-G 生成动态连接库
link方式使用动态连接库的编译参数如下。文件welcome.c,编译成welcome可执行程序。
- extern void welcome(void);
- int main(void)
- {
- welcome();
- return 0;
- }
linux:
gcc -rdynamic -o welcome welcome.c -L. -lwel
-rdynamic 导出所有符号供动态使用
sco unix open server:
cc -b elf -o welcome welcome.c -L. -lwel
-b elf 必须使用ELF的可执行文件格式
AIX:
xlc -bdynamic -brtl -o welcome welcome.c -L. -lwel
-bdynamic 使用动态连接方式,系统默认为此方式
-brtl -l参数使用.so为库
HP UX:
cc -dynamic -o welcome welcome.c -L. -lwel
-dynamic 使用动态连接方式,系统默认为此方式
SUN OS:
编译libwel.so:
cc -B dynamic -o welcome welcome.c -L. -lwel
-B dynamic 使用动态连接方式
dlopen方式,其实就是把打开动态库和查找符号的动作放在程序中执行。因此编译可执行文件与普通的相同,只要连接libdl.so库即可。文件welcome.c,编译成welcome可执行程序。
- #include <dlfcn.h>
- int main(void)
- {
- void *handle;
- void (*welcome)(void);
- handle=dlopen("libwel.so",RTLD_LAZY);
- welcome=dlsym(handle,"welcome");
- (*welcome)();
- return 0;
- }
linux:
gcc -rdynamic -o welcome welcome.c -ldl
-rdynamic 导出所有符号供动态使用
-ldl 用系统libdl.so库dlopen(),dlsym(),dlerror(),dlclose()
sco unix open server:
cc -b elf -o welcome welcome.c -lc
-b elf 以elf格式,动态连接库必须
AIX:
xlc -bexpall -o welcome welcome.c -ldl -lc
-bexpall 使主程序的符号可以被动态库使用
HP UX:
cc -o welcome welcome.c -ldl -lc
SUN OS:
cc -o welcome welcome.c -ldl -lc
------------------------------------------------------------------------------
参照的man手册:
cc, ld, ldd, dlopen, dlclose, dlerror, dlsym, CC
另:AIX运行动态库时会加载系统内存统一管理,导致即使程序已退出,编译时仍然认为还在使用而无法覆盖。有两个办法,一是root用户执行slibclean,清理系统加载而无人使用的动态库,另一种是编译的库chmod go-rwx,使得组和其他人无权限,这种库系统会认为用户特有而不加载。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/283313/viewspace-2139257/,如需转载,请注明出处,否则将追究法律责任。