Hello,
I would like to provide some feedback which may be useful for build of
DBD-Oracle.
I basically wanted to avoid using DYLD_LIBRARY_PATH because the OS complains
whenever an suid command is executed, such as ps(1).
So I did a bit of RTFM and googling that I would like to share, as it maye be
useful for others too :-)
1. I patched the shared libs and the executables using a small variation of the
script found at this location
http://blog.caseylucas.com/2013/03/03/oracle-sqlplus-and-instant-client-on-mac-osx-without-dyld_library_path/
My change is basically using @loader_path for the dylibs and
@executable_path for the actual executables.
2. Added the 2 symlinks as usual:
./libclntsh.dylib -> libclntsh.dylib.11.1
./libocci.dylib -> libocci.dylib.11.1
3. Make sure that instantclient_11_2 is in my PATH (basically I should be
able to launch sqlplus ) and build as usual:
perl Makefile.PL && make
4. I noticed that the produced bundle fails to load the libclnt.dylib and
checking with otool -L revealed that the LD_RUN_PATH and -R options are not
honored on OS/X 10.8
$ perl -w -Mblib -MDBD::Oracle -le 1
Can't load
'/Users/phil/X1/DBD-Oracle-1.58/blib/arch/auto/DBD/Oracle/Oracle.bundle' for
module DBD::Oracle:
dlopen(/Users/phil/X1/DBD-Oracle-1.58/blib/arch/auto/DBD/Oracle/Oracle.bundle,
1): Library not loaded: libclntsh.dylib.11.1
Referenced from:
/Users/phil/X1/DBD-Oracle-1.58/blib/arch/auto/DBD/Oracle/Oracle.bundle
Reason: image not found at /usr/local/ActivePerl-5.16/lib/DynaLoader.pm line
195.
at -e line 0.
Compilation failed in require.
BEGIN failed--compilation aborted.
So, I used otool and checked the bundle:
$ otool -L
/Users/phil/X1/DBD-Oracle-1.58/blib/arch/auto/DBD/Oracle/Oracle.bundle
/Users/phil/X1/DBD-Oracle-1.58/blib/arch/auto/DBD/Oracle/Oracle.bundle:
libclntsh.dylib.11.1 (compatibility version 0.0.0, current version
0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current
version 169.3.0)
Modifying the bundle before installation :
install_name_tool \
-change libclntsh.dylib.11.1 @rpath/libclntsh.dylib.11.1 \
-add_rpath /usr/local/instantclient_11_2 \
blib/arch/auto/DBD/Oracle/Oracle.bundle
And now it works :-)
$ env PERL_DL_NON_LAZY=1 perl -w -M5.016 -MDBI -Mblib -MDBD::Oracle -le
"DBI->connect('dbi:Oracle:host=localhost;port=1521;sid=orcl;', 'system',
'oracle') && say 'it works'";
it works
This leaves me under the (bad) impression that LD_RUN_PATH is ignored on
Mountain Lion (10.8.3) ?
If this is the case, maybe some changes required in MakeMaker...
But anyway, thanks to install_name_tool I have a working DBD::Oracle that
doesn't require DYLD_LIBRARY_PATH !
I hope this information may be useful -- eventually as an addition to this
document
http://search.cpan.org/dist/DBD-Oracle/lib/DBD/Oracle/Troubleshooting/Macos.pod
Best regards,
/Philippe.
#======== Patch script looks like this now: =============
#!/bin/sh
# script to change the dynamic lib paths and ids for oracle instant client
# exes and libs
# proces all the executable files in this directory
for exe in sqlplus adrci genezi uidrvci
do
echo adjusting executable $exe
baseexe=`basename $exe`
otool -L $exe | awk '/oracle/ {print $1}' | while read lib
do
echo adjusting lib $lib
baselib=`basename $lib`
if [ "$baseexe" = "$baselib" ]
then
echo changing id to $baselib for $exe
install_name_tool -id $baselib $exe
else
echo changing path id for $lib in $exe
install_name_tool -change $lib @executable_path/$baselib $exe
fi
done
done
for exe in *dylib*
do
echo adjusting executable $exe
baseexe=`basename $exe`
otool -L $exe | awk '/oracle/ {print $1}' | while read lib
do
echo adjusting lib $lib
baselib=`basename $lib`
if [ "$baseexe" = "$baselib" ]
then
echo changing id to $baselib for $exe
install_name_tool -id $baselib $exe
else
echo changing path id for $lib in $exe
install_name_tool -change $lib @loader_path/$baselib $exe
fi
done
done
#----------------------------------------------------------