sqlplus所用动态库分析一例

0
分享 2018-10-30
今天有朋友问了在linux下sqlplus调用动态库问题。
朋友问题:
我在linux安装oracle的客户端(管理)后,设置完PATH=$ORACLE_HOME/bin目录后,没有设置别的环境变量就可以执行sqllplus了,但是在同一个操作用户下别的调用OCI的程序执行的时候报找不到libclntsh.so的错误,这是为什么。
分析:
自己写的调用的OCI写的程序是需要OCI动态库,由于没有设置LD_LIBRARY_PATH环境变量因此找不到,这是正常的,通过将LD_LIBRARY_PATH设置成$ORACLE_HOME/lib就可以解决的,但是sqlplus也是调用的OCI接口的,为什么不需要设置LD_LIBRARY_PATH就可以正常运行呢。

测试:
1. 在CentOS上安装Oracle11.2.0.1 X64客户端,安装到oracle操作目录下。
2. 设置.bash_profile环境变量如下:


export ORACLE_HOME=$HOME/app/oracle/product/11.2.0/client_1;
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$ORACLE_HOME/bin
export PATH

3. 执行sqlplus,正常。


[oracle@dataserver ~]$ sqlplus

SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 1 14:30:53 2018

Copyright (c) 1982, 2009, Oracle. All rights reserved.

4. 通过ldd命令发现确实能找到OCI的动态库


[oracle@dataserver bin]$ ldd sqlplus
linux-vdso.so.1 => (0x00007ffeef7f6000)
libsqlplus.so => /home/oracle/app/oracle/product/11.2.0/client_1/lib/libsqlplus.so (0x00007fc148b58000)
libclntsh.so.11.1 => /home/oracle/app/oracle/product/11.2.0/client_1/lib/libclntsh.so.11.1 (0x00007fc14652c000)
libnnz11.so => /home/oracle/app/oracle/product/11.2.0/client_1/lib/libnnz11.so (0x00007fc146164000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc145f38000)
libm.so.6 => /lib64/libm.so.6 (0x00007fc145c35000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc145a19000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fc145800000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc14543c000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007fc14523a000)
/lib64/ld-linux-x86-64.so.2 (0x000055916f90e000)

5. 查看LD_LIBRARY_PATH


[oracle@dataserver ~]$ echo $LD_LIBRARY_PATH


也确实为空。
查看/etc/ld.so.conf文件也确实没有相关内容。


那只有一种可能了,那就是安装oracle的客户端的时候,编译sqlplus通过-Wl,-rpath选项将$ORACLE_HOME/lib作为动态库搜索目录添加到 sqlplus中了。
6. 如果硬编译到sqlplus中的话,查看sqlplus的字符串内容会发现写内容。

[oracle@dataserver bin]$ strings sqlplus
/lib64/ld-linux-x86-64.so.2
l:m|
libsqlplus.so
saficxa
afidrv
_Jv_RegisterClasses
__gmon_start__
libclntsh.so.11.1
_ITM_deregisterTMCloneTable
_ITM_registerTMCloneTable
__intel_new_proc_init
_fini
libnnz11.so
libdl.so.2
libm.so.6
libpthread.so.0
libnsl.so.1
libc.so.6
__libc_start_main
_edata
__bss_start
_end
/home/oracle/app/oracle/product/11.2.0/client_1/lib
GLIBC_2.2.5
%z
%r
UH-H
UH-H
[]A\A]A^A_
;*3$"
GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-16)
-?comment:Intel(R) C++ Compiler for applications running on Intel(R) 64, Version 10.1 Build 20090203 %s : s0afimai.c : -I/ade/aime_sqlplus_466237/oracle/sqlplus/include/ -I/ade/aime_sqlplus_466237/oracle/oracore/include -I/ade/aime_sqlplus_466237/oracle/oracore/public -I/ade/aime_sqlplus_466237/oracle/oracore/port/include -I/ade/aime_sqlplus_466237/oracle/xdk/include -I/ade/aime_sqlplus_466237/oracle/xdk/public -I/ade/aime_sqlplus_466237/oracle/nlsrtl/include -I/ade/aime_sqlplus_466237/oracle/network/public -I/ade/aime_sqlplus_466237/oracle/network/include -I/ade/aime_sqlplus_466237/oracle/rdbms/public -I/ade/aime_sqlplus_466237/oracle/rdbms/include -I/ade/aime_sqlplus_466237/oracle/rdbms/src/port/generic -I/ade/aime_sqlplus_466237/oracle/plsql/public -I/ade/aime_sqlplus_466237/oracle/plsql/include -I/ade/aime_sqlplus_466237/oracle/precomp/public -I/ade/aime_sqlplus_466237/oracle/precomp/include -I/ade/aime_sqlplus_466237/oracle/rdbms/src/hdir -I/modules/fastcgi/devkit/include -I/ade/aime_sqlplus_466237/oracle//include -I/ade/aime_sqlplus_466237/oracle//include/linux -c -o /ade/aime_sqlplus_466237/oracle/sqlplus/lib/s0afimai.o -O2 -trigraphs -std=c89 -fno-omit-frame-pointer -mp1 -fp_port -mP2OPT_convert_opt=F -fno-strict-aliasing -sox -no-global-hoist -wd191 -wd175 -wd188 -wd810 -we127 -we1345 -we1338 -wd279 -wd186 -wd1572 -wd589 -we592 -Qoption,cpp,--treat_func_as_string_literal -mPGOPTI_func_group -fPIC -DLINUX -DORAX86_64 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS -DLONG_IS_64 -DSS_64BIT_SERVER -DLDAP_CM -DAFI_EDINA -DAFI_EDINA_HACK -DLMM_USETAGS -DNTEV_USE_POLL -DNTEV_USE_QUEUE -DNTEV_USE_GENERIC -DNTEV_USE_EPOLL -defaultlib:libirc
.symtab
.strtab
.shstrtab
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.jcr
.dynamic
.got
.got.plt
.data
.bss
.comment
crtstuff.c
__JCR_LIST__
deregister_tm_clones
register_tm_clones
__do_global_dtors_aux
completed.6344
__do_global_dtors_aux_fini_array_entry
frame_dummy
__frame_dummy_init_array_entry
s0afimai.c
__FRAME_END__
__JCR_END__
_DYNAMIC
__init_array_end
__init_array_start
_GLOBAL_OFFSET_TABLE_
_edata
saficxa
data_start
_IO_stdin_used
main
__dso_handle
_fini
_start
__intel_new_proc_init
_init
__TMC_END__
_Jv_RegisterClasses
__data_start
_end
__bss_start
__libc_csu_init
afidrv
_ITM_deregisterTMCloneTable
__libc_csu_fini
__libc_start_main@@GLIBC_2.2.5
__gmon_start__
_ITM_registerTMCloneTable

确实发现了$ORACLE_HOME/lib目录相关信息。

文章来源:http://blog.csdn.net/liufeng1980423/article/details/81330042

0 个评论

要回复文章请先登录注册