— jeżeli DLL chcemy mieć w niestandardowej lokalizacji np. tu: /opt/libdodatkowe, to:
vi /etc/ld.so.conf.d/libdodatkowe.conf
/opt/libdodatkowe
ldconfig
— konfig extproca
vi /u01/app/oracle/product/19.0.0.0/dbhome_1/hs/admin/extproc.ora
SET EXTPROC_DLLS=ANY
SET LD_LIBRARY_PATH=/opt/libdodatkowe:/u01/app/oracle/product/19.0.0.0/dbhome_1/lib:/lib64:/lib
działa
— dlaczego tak jak wyzej? bo standardowo nie mogło zadziałać za pierwszym razem 🙂
DEBUG:
nawiązujemy połączenie z DB i odwołujemy się do dll zeby wyskoczył błąd:
ORA-06520: PL/SQL: Error loading external library
— trzymamy sesje sqlplusa i szukamy procesu „/extproc”
for i in ps aux | grep "/extproc" | grep -v grep | awk '{print $2}'
; do echo $i; cat /proc/$i/environ | tr '\0' '\n' | egrep "LD_LIBRARY_PATH|EXTPROC_DLLS"; done
— wyskoczy np.
101893
EXTPROC_DLLS=ANY
LD_LIBRARY_PATH=/opt/libdodatkowe:/u01/app/oracle/product/19.0.0.0/dbhome_1/lib:/lib64:/lib
— bieżemy PID z góry 101893 i lecimy z strace
strace -f -p 101893 -e trace=file
— w tej samej sesji sqlplusa ponawiamy próbę i w strace widzimy:
strace: Process 101893 attached
openat(AT_FDCWD, "/opt/libasseco/test.so", O_RDONLY|O_CLOEXEC) = 13
openat(AT_FDCWD, "/u01/app/oracle/product/19.0.0.0/dbhome_1/lib/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 13
openat(AT_FDCWD, "/lib64/tls/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib64/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib64/tls/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib64/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
czyli widzimy, że pomimo wpisania w extproc.ora LD_LIBRARY_PATH, ścieżki do bibliotek i tak w „potomnych” szuka jedynie w ścieżkach systemowych i dlatego dodajemy jeszcze ścieżke z biblio do /etc/ld.so.conf.d, albo olewamy i wrzucamy / linkujemy biblio do katalogów wyżej