温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

各unix平台动态连接库的编译与使用是怎么样的

发布时间:2021-11-03 16:00:11 来源:亿速云 阅读:110 作者:柒染 栏目:建站服务器

各unix平台动态连接库的编译与使用是怎么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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


AIX运行动态库时会加载系统内存统一管理,导致即使程序已退出,编译时仍然认为还在使用而无法覆盖。有两个办法,一是root用户执行slibclean,清理系统加载而无人使用的动态库,另一种是编译的库chmod go-rwx,使得组和其他人无权限,这种库系统会认为用户特有而不加载。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI