在AIX6.1下bash运行异常的解决

来源:互联网 发布:mc9s12x 串口编程 编辑:程序博客网 时间:2024/05/17 03:17

情景:

 由于需要在AIX下运行基于OCI的程序。在.profile中设置了几个关键的环境变量:

LD_LIBRARY_PATH=/oracle/OraHome_1/lib:/usr/vacpp/lib:/lib:/usr/lib

ORACLE_HOME=/oracle/OraHome_1

 

. .profile让profile生效后。运行bash出现:

exec():0509-036 由于以下错误,不能装入程序 bash:
        0509-022 不能装入模块 /opt/pware/lib/libintl.a(libintl.so.8)。
        0509-150   未能装入从属模块 /lib/libiconv.a(libiconv.so.2)。
        0509-152   在归档  中找不到成员 libiconv.so.2
        0509-022 不能装入模块 bash。
        0509-150   未能装入从属模块 /opt/pware/lib/libintl.a(libintl.so.8)。
        0509-022 不能装入模块 。

分析:

         1.

         输入: which bash

         得到:/opt/pware/bin/bash.得知其可执行程序bash在/opt/pware/bin目录下。

         2.进入/opt/pware/bin目录下:

         输入:ldd bash

         得到如下输出结果:

bash 需要:
         /usr/lib/libcurses.a(shr42.o)
         /opt/pware/lib/libintl.a(libintl.so.8)
         /usr/lib/libpthread.a(shr_xpg5.o)
         /usr/lib/libc.a(shr.o)
         /usr/lib/librtl.a(shr.o)
         /opt/pware/lib/libiconv.a(libiconv.so.2)
         /usr/lib/libpthreads.a(shr_comm.o)
         /unix
         /usr/lib/libcrypt.a(shr.o)

  

        3.结合可执行程序依赖的动态库和运行bash的报错,分析可能是可执行程序实际加载的libintl.a或libiconv.so.2不是 这个目录下的: /opt/pware/lib/libintl.a(libintl.so.8)。导致程序动态库链接在运行 阶段链接到版本不合适的库文件。
          让我们来看看LD_LIBRARY_PATH=/oracle/OraHome_1/lib:/usr/vacpp/lib:/lib:/usr/lib中/lib中有没有libintl.a相关的设置:

           进入/lib目录,运行ls -l|grep libintl.a

          得到输出:

          lrwxrwxrwx    1 root     system           32  7月19 12时55 libintl.a ->../../opt/freeware/lib/libintl.a

 

结论:果然设置的LD_LIBRARY_PATH中对libintl.a的链接目录指向了../../opt/freeware/lib。而bash中需要的libintl.a来自   /opt/pware/lib

            所以在LD_LIBRARY_PATH中去掉/lib。bash最总能够运行了!

 

总结:不管是用户进程还是系统命令,在运行阶段,需要连接进来动态库时,都优先扫其关心的环境变量。如果有其需要的动态库,就将其链接到进程空间。这就覆盖了程序本身声明的动态库路径寻找。导致版本不符出现模块不能加载的错误。

           所以在环境变量中设置库路径时应该避免设置被错误覆盖的问题。这个在Mq编程中也有所暴露:

           LD_LIBRARY_PATH=/usr/mqm/lib:/oracle/OraHome_1/lib32:/usr/vacpp/lib:/lib。这个链接是Mq的32的库路径。结果Mq7.X版本的命令都是64位的。这些命令运行时扫LD_LIBRARY_PATH时加载了这些土鳖32位库。导致命令不能运行。报幻数出错。

           所有要不就不设置/usr/mqm/lib,如果必须设置,就必须设置/usr/mqm/lib64    !!!!!!!!!