當我們在linux上部署自己開發(fā)的項目程序時,項目代碼與依賴庫完整拷貝過去之后,直接運行我們自己的可執(zhí)行程序,往往提示找不到所相關的.so庫,會報錯。
系統(tǒng)只會去默認搜尋目錄(/lib和/usr/lib
)下, 以及動態(tài)庫配置文件(/etc/ld.so.conf和/etc/ld.so.conf.d/*.conf
)里所列的目錄下, 搜索可共享的動態(tài)庫(格式如lib*.so*), 進而創(chuàng)建出動態(tài)裝入程序*(ld.so)*所需的連接和緩存文件。因此,需要我們手動將路徑添加進去。
1. 利用ldd查看可執(zhí)行程序(動態(tài)庫)的依賴庫
使用 ldd -r XXX
查詢動態(tài)庫的依賴。關于undefined symbol
使用 C++filt
查看
[user@localhost dist]$ ldd /usr/bin/bash
linux-vdso.so.1 => (0x00007ffdbe9e0000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fa7da66c000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fa7da468000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa7da09a000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa7da896000)
[user@localhost ocr_server]$ ldd libgims.so
linux-vdso.so.1 => (0x00007ffca0de1000)
libopencv_imgproc.so.405 => /usr/local/lib64/libopencv_imgproc.so.405 (0x00007f6dbb5ce000)
libopencv_core.so.405 => /usr/local/lib64/libopencv_core.so.405 (0x00007f6dba3df000)
libopencv_imgcodecs.so.405 => /usr/local/lib64/libopencv_imgcodecs.so.405 (0x00007f6db9e57000)
libonnxruntime.so.1.11.1 => /home/user/onnxruntime/lib/libonnxruntime.so.1.11.1 (0x00007f6db8fef000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f6db8ce7000)
libm.so.6 => /lib64/libm.so.6 (0x00007f6db89e5000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6db87cf000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6db8401000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6db81e5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6db7fe1000)
libpng15.so.15 => /lib64/libpng15.so.15 (0x00007f6db7998000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6dbd551000)
[wangsp@localhost ocr_server]$ ldd libASL_gcn_label.so `{部署到生產(chǎn)環(huán)境出現(xiàn)錯誤:not found}`
linux-vdso.so.1 => not found
libopencv_imgproc.so.405 => not found
libopencv_core.so.405 => not found
libopencv_imgcodecs.so.405 => not found
libonnxruntime.so.1.11.1 => not found
libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007f1013e6a000)
libm.so.6 => /lib64/libm.so.6 (0x00007f1013b68000)
libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007f1013950000)
libc.so.6 => /lib64/libc.so.6 (0x00007f1013582000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1013366000)
libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007f1012aef000)
libpng15.so.15 => /lib64/libpng15.so.15 (0x00007f10128c4000)
libtiff.so.5 => /lib64/libtiff.so.5 (0x00007f1012650000)
/lib64/ld-linux-x86-64.so.2 (0x00007f101785f000)
libjbig.so.2.0 => /lib64/libjbig.so.2.0 (0x00007f1012444000)
方法:
-
在 /etc/ld.so.conf.d 目錄下創(chuàng)建 XXX_server.conf 文件,將該軟件依賴的庫路徑添加進去
echo /home/user/Project/XXX_server/ > /etc/ld.so.conf.d/XXX_server.conf
執(zhí)行生效ldconfig
-
或者:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path
或者:echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/' >> ~/.bashrc
2. 利用pldd獲取進程的內存映射信息,進程的依賴共享庫
如下XXX
即需要查詢的程序名稱pldd $(ps -ef | grep XXX| grep -v grep | awk '{print $2}')
[user@localhost laun]$ sudo pldd $(ps -ef | grep XXX | grep -v grep | awk '{print $2}')
3172: /home/user/laun/dist/XXX/XXX
linux-vdso.so.1
/lib64/libdl.so.2
/home/user/laun/dist/XXX/libz.so.1
/lib64/libpthread.so.0
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
/home/user/laun/dist/XXX/libpython3.6m.so.1.0
/lib64/libutil.so.1
/lib64/libm.so.6
/home/user/laun/dist/XXX/lib-dynload/_struct.cpython-36m-x86_64-linux-gnu.so
/home/user/laun/dist/XXX/lib-dynload/zlib.cpython-36m-x86_64-linux-gnu.so
...
/home/user/laun/dist/XXX/lib-dynload/_json.cpython-36m-x86_64-linux-gnu.so
/home/user/laun/dist/XXX/markupsafe/_speedups.cpython-36m-x86_64-linux-gnu.so
/home/user/laun/dist/XXX/lib-dynload/unicodedata.cpython-36m-x86_64-linux-gnu.so
./XXX/libgims.so
/usr/local/lib64/libopencv_imgproc.so.405
/usr/local/lib64/libopencv_core.so.405
/usr/local/lib64/libopencv_imgcodecs.so.405
/home/user/onnxruntime-linux-x64-1.11.1/lib/libonnxruntime.so.1.11.1
/lib64/libpng15.so.15
./XXX/libgmc.so
./XXX/libgcn_label.so
./XXX/libASL_gcn_label.so
./XXX/libiisis.so
./XXX/libit_dwmp.so
./XXX/libit_dwmp2.so
./XXX/liblgbm.so
/home/user/laun/dist/XXX/gevent/_gevent_c_imap.cpython-36m-x86_64-linux-gnu.so
/home/user/laun/dist/XXX/lib-dynload/_multiprocessing.cpython-36m-x86_64-linux-gnu.so
3. 利用pmap工具查詢未知的可執(zhí)行程序的依賴庫
[user@localhost dist]$ objdump -p /usr/local/php/bin/php |grep NEEDED
NEEDED libcrypt.so.1
NEEDED librt.so.1
NEEDED libmysqlclient.so.18
NEEDED libmcrypt.so.4
NEEDED libiconv.so.2
NEEDED libcurl.so.4
NEEDED libm.so.6
NEEDED libdl.so.2
NEEDED libnsl.so.1
NEEDED libxml2.so.2
NEEDED libz.so.1
NEEDED libssl.so.10
NEEDED libcrypto.so.10
NEEDED libpthread.so.0
NEEDED libc.so.6
NEEDED libresolv.so.2
4. 利用pmap查看正在運行時的進程的依賴庫
[user@localhost ~/software/pldd]$ ps -ef|grep php-fpm
root 26534 1 0 2014 ? 00:01:34 php-fpm: master process (/usr/local/php-5.3.29/etc/php-fpm.conf)
nobody 26535 26534 0 2014 ? 00:00:04 php-fpm: pool www
nobody 26536 26534 0 2014 ? 00:00:05 php-fpm: pool www
root 30510 30324 0 00:39 pts/0 00:00:00 grep php-fpm
[user@localhost ~/software/pldd]$ pmap 26534 |head
26534: php-fpm: master process (/usr/local/php-5.3.29/etc/php-fpm.conf)
0000000000400000 10452K r-x-- /usr/local/php-5.3.29/sbin/php-fpm
0000000001035000 76K rw--- /usr/local/php-5.3.29/sbin/php-fpm
0000000001048000 104K rw--- [ anon ]
0000000002a65000 3448K rw--- [ anon ]
000000311c600000 388K r-x-- /usr/lib64/libssl.so.1.0.1e
000000311c661000 2048K ----- /usr/lib64/libssl.so.1.0.1e
000000311c861000 16K r---- /usr/lib64/libssl.so.1.0.1e
000000311c865000 28K rw--- /usr/lib64/libssl.so.1.0.1e
000000311ce00000 92K r-x-- /lib64/libpthread-2.12.so
5. ln 命令
-
ln(link 其實link命令的縮寫) 具體使用: ln [選項] 目標文件
-
選項有如下
-s 使用軟連接
-b 刪除,覆蓋之前建立的鏈接
-d 允許超級用戶制作目錄的硬鏈接
-f 強制執(zhí)行
-i 交互模式,文件存在則提示用戶是否覆蓋
-n 把符號鏈接視為一般目錄
-v 顯示詳細的處理過程
6. version GLIBCXX_3.4.20 not found 錯誤解決
參考:Linux 批量依賴庫拷貝(ldd)
version GLIBCXX_3.4.20 not found 錯誤解決
libstdc++.so.6: version `GLIBCXX_3.4.21‘ not found文章來源:http://www.zghlxwxcb.cn/news/detail-784064.html
7. 使用dlopen加載動態(tài)庫
https://www.cnblogs.com/0xzhang/p/14460925.html
https://www.cnblogs.com/Anker/p/3746802.html文章來源地址http://www.zghlxwxcb.cn/news/detail-784064.html
到了這里,關于Linux 查看程序(動態(tài)庫)、進程的依賴庫的方法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!