sqlplus所用动态库分析一例

今天有朋友问了在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目录相关信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值