当前位置: 技术问答>linux和unix
求解:Aix5.2系统中dlopen错误,dlerror返回“Bad Address”
来源: 互联网 发布时间:2015-12-25
本文导语: 测试程序过程中突然出现这个问题,把之前备份的bin文件和so文件恢复还是出错,bin文件是个守护进程,测试时经常打开关闭,怀疑时系统的问题。不知有没有哪位遇见过这个问题? | HPUX平台...
测试程序过程中突然出现这个问题,把之前备份的bin文件和so文件恢复还是出错,bin文件是个守护进程,测试时经常打开关闭,怀疑时系统的问题。不知有没有哪位遇见过这个问题?
|
HPUX平台上,无论是PA-RISC还是IA64架构上,都存在共同的问题:
链有线程库libpthread.so的lib,在dlopen的时候经常会报错,如tclsh在load liboratcl.so的时候[如下实际上是一个dlopen的过程],报告如下错误:
-bash-3.00$ tclsh
% package require Oratcl
/usr/lib/hpux32/dld.so: Cannot dlopen load module '/usr/lib/hpux32/libpthread.so.1' because it contains thread specific data.
/usr/lib/hpux32/dld.so: Cannot dlopen load module '/usr/lib/hpux32/libpthread.so.1' because it contains thread specific data.
couldn't load file "/usr/local/lib/oratcl4.1/../liboratcl4.1.sl": exec format error
%
解决办法:
可以说,在HP平台上,除了LD_PRELOAD之外,没有更好的解决办法(关于LD_PRELOAD大家可以查找相应的资料来了解,这里不作过多的解释):
-bash-3.00$ echo "export LD_PRELOAD=/usr/lib/hpux32/libpthread.so.1" >> .profile
-bash-3.00$ . .profile
-bash-3.00$ tclsh
% package require Oratcl
4.1
% info command
oralogon tell socket subst open eof oraplexec pwd oraopen glob list exec
...........
%
进而以上关于本地线程存储的问题通过LD_PRELAD得以解决。
注:同样的问题在Solaris平台上也是存在的,比如链接lilbmtmalloc.so的时候,解决方法类似:libpthread.so->libmtmalloc.so
链有线程库libpthread.so的lib,在dlopen的时候经常会报错,如tclsh在load liboratcl.so的时候[如下实际上是一个dlopen的过程],报告如下错误:
-bash-3.00$ tclsh
% package require Oratcl
/usr/lib/hpux32/dld.so: Cannot dlopen load module '/usr/lib/hpux32/libpthread.so.1' because it contains thread specific data.
/usr/lib/hpux32/dld.so: Cannot dlopen load module '/usr/lib/hpux32/libpthread.so.1' because it contains thread specific data.
couldn't load file "/usr/local/lib/oratcl4.1/../liboratcl4.1.sl": exec format error
%
解决办法:
可以说,在HP平台上,除了LD_PRELOAD之外,没有更好的解决办法(关于LD_PRELOAD大家可以查找相应的资料来了解,这里不作过多的解释):
-bash-3.00$ echo "export LD_PRELOAD=/usr/lib/hpux32/libpthread.so.1" >> .profile
-bash-3.00$ . .profile
-bash-3.00$ tclsh
% package require Oratcl
4.1
% info command
oralogon tell socket subst open eof oraplexec pwd oraopen glob list exec
...........
%
进而以上关于本地线程存储的问题通过LD_PRELAD得以解决。
注:同样的问题在Solaris平台上也是存在的,比如链接lilbmtmalloc.so的时候,解决方法类似:libpthread.so->libmtmalloc.so