linux下可执行文件无法执行问题定位排查
引言:
? ? ?最近使用centos7.4?minimal裝環境,在編譯一個可執行文件后,無法運行改可執行文件。
參考:
https://www.cnblogs.com/wanghetao/p/3779611.html
https://blog.csdn.net/qq_26819733/article/details/50610129
https://www.cnblogs.com/findumars/p/7128511.html
問題排查
報錯信息如下:
xxxxx>test test: error while loading shared libraries: libmqic.so: wrong ELF class: ELFCLASS64翻譯過來大致意思如下:?加載動態庫libmqic.so出錯,原因是該庫為64位文件。
的確,test是我編譯的32bits的可執行文件,使flie可以查看出文件位數
>file test test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=db1dfaa8ad3d16e5aa5c109b05ac22f1f092954d, not stripped根據以上結果我推斷出可能是依賴的?libmqic.so是32位的。于是查找對應的makefile文件。
gcc -m32 -o ../bin/test comm.o util.o test.o -L/opt/mqm/lib -lmqic發現編譯的時候鏈接的動態庫為?/opt/mqm/lib/libmqic.so,查看該庫位數為32位
>file /opt/mqm/lib/libmqic.so /opt/mqm/lib/libmqic.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=7003de3a60f76e90232a89982daa3e3b16b5d776, not stripped那問題來了,為什么編譯的使用的32的libmqic.so庫(如果使用64的庫鏈接的時候就會報錯,壓根到不了運行時)還是報錯。這時候重點來了,使用ldd命令(ldd,命令介紹推薦)查看該bin文件依賴的動態庫
>ldd test linux-gate.so.1 => (0xf771c000)libmqic.so => not foundlibc.so.6 => /lib/libc.so.6 (0xf7548000)/lib/ld-linux.so.2 (0xf771d000)通過ldd的結果可以看出?libmqic.so =>not found,意味著bin文件中沒有找到對應的?libmqic.so動態庫,但是?/opt/mqm/lib/存在libmqic.so庫,從這里已經基本斷定是環境變量的問題導致bin在執行的時候找不到關聯的動態庫。
一般找不到動態庫的問題可以有三種方式解決:
? ? 2. /etc/ld.so.conf 追加依賴的動態庫路徑,并使用運行一個命令:ldconfig (該命令用來刷新系統的共享庫緩存,即?/etc/ld.so.cache?文件),
? ? ?3. 修改環境變量LD_LIBRARY_PATH增加對應動態庫路徑
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/mqm/lib:建議使用第三種方式,簡單方便靈活。
那最后一個問題,為什么bin文件在運行時報錯:test: error while loading shared libraries: libmqic.so: wrong ELF class: ELFCLASS64呢?
原因是:編譯的時候使用的/opt/mqm/lib/libmqic.so(32-bit),但是運行的時候找到的libmqic.so是/opt/mqm/lib64的,該庫是64的庫(/opt/mqm/lib64被我加到環境變量LD_LIBRARY_PATH中了,但是?/opt/mqm/lib沒有放到環境變量中),但是執行文件是32-bit的。
總結:
? ?對動態庫的鏈接方式有點模糊了,編譯的時候指定的動態庫進行鏈接的過程實際上只是編譯時只獲取必要的接口信息(全局符號)已經編譯檢查。動態庫只有在執行的時候的才會被加載。但是如果程序運行的過程找不到對應的動態庫就會報錯。
總結
以上是生活随笔為你收集整理的linux下可执行文件无法执行问题定位排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea svn切换分支,合并分支
- 下一篇: linux 其他常用命令