ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Linux环境下动态库的问题

Linux环境下动态库的问题

原创 Linux操作系统 作者:lihuiitpub 时间:2010-11-04 16:33:29 0 删除 编辑
Normal 0 7.8 磅 0 2 MicrosoftInternetExplorer4 1.     Linux环境下动态库的问题

1.1.   问题描述

系统运行过程中,之前本来跑的好好的程序down了之后再重启,运行结果又不同了,甚至segment fault。这是一个常见又棘手的问题。

1.2.   排查

首先ldd,排查程序的动态链接库,在多用户开发的系统环境下,系统变量经常被别人修改,尤其关注与动态链接库相关的LD_LIBRARY_PATH变量

程序编译时,动态库的搜索顺序如下:
  
(1)ld-linux.so.6由gcc的spec文件中所设定
  
(2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
  
(3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib
  
(2)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”查看)

程序运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下:
  
(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
    
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local /lib
  
(3)LD_LIBRARY_PATH环境变量中所设定的路径
  
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的 ld.so.cache中

 

   无论是程序编译还是执行,LD_LIBRARY_PATH是一个非常重要的环境变量,而且在多用户开发的系统环境下,还经常根据系统配置文件的修改而被修改,导致之前本来跑的好好的程序down了之后再重启,运行结果又不同了。

   环境变量的设置

(1)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。

(2)/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。

(3)~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户 的.bashrc文件。

(4)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

(5)~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。

(6)~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/16856446/viewspace-677382/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-19

  • 博文量
    113
  • 访问量
    215123