日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下可执行文件无法执行问题定位排查

發布時間:2023/12/31 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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在執行的時候找不到關聯的動態庫。

一般找不到動態庫的問題可以有三種方式解決:

  • 添加對應軟連接(軟件存放路徑/usr/lib 或者/lib) 如下:
  • ls -s /opt/mqm/libmqic.so /usr/lib/libmqic.so

    ? ? 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下可执行文件无法执行问题定位排查的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。