91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux中ELF文件的示例分析

發布時間:2021-10-25 09:26:50 來源:億速云 閱讀:276 作者:小新 欄目:系統運維

這篇文章給大家分享的是有關linux中ELF文件的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

示例程序

我們的示例程序如下:

#include<stdio.h> int main(int argc,char *argv[]) {     printf("hello shouwangxiansheng\n");     return 0 ; }

編譯:

$ gcc -o hello hello.c

得到hello可執行文件。

查看文件類型

file命令可以用來查看文件類型:

$ file hello hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=8f1de0f59bdfe9aaff85ade6898173aa436b296a, not stripped

從結果中,我們可以知道,它是ELF可執行文件,且是64位程序,有動態鏈接,最后的not stripped也表明了它保留了符號表信息或者調試信息。

如果不是可執行文件,它的信息是怎樣的呢?舉個例子:

$ file hello.c hello.c: C source, UTF-8 Unicode text

看到了吧。

查看ELF頭

readelf用于查看ELF文件,而:

$ readelf -h hello ELF Header:   Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00    Class:                             ELF64   Data:                              2's complement, little endian   Version:                           1 (current)   OS/ABI:                            UNIX - System V   ABI Version:                       0   Type:                              EXEC (Executable file)   Machine:                           Advanced Micro Devices X86-64 (略)

可以看到它是EXEC,即可執行文件,且小端程序,運行于X86-64。在交叉編譯的時候,這個文件頭的信息也非常有用。例如你在x86的機器上交叉編譯出powerpc的可執行文件,在powerpc上卻不被識別,不能運行,不如用readelf看看它的Machine字段,是不是沒有編譯好。

查找ELF文件中的字符串

例如,你在文件中寫入了版本號或者特殊字符串,可以通過strings命令搜索到:

$ strings hello|grep shouwang hello shouwangxiansheng

查看ELF文件各段大小

$ size hello    text       data     bss     dec     hex filename    1210        552       8    1770     6ea hello

這里可以看到代碼段,數據段各自占多少,必要時候還可以根據需要優化代碼,減少磁盤空間占用。

查看鏈接的動態庫

運行時出現找不到動態庫?不如看看它鏈接了哪些庫吧:

$ ldd hello     linux-vdso.so.1 =>  (0x00007ffd16386000)     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f507e083000)     /lib64/ld-linux-x86-64.so.2 (0x00007f507e44d000)

可以看到它鏈接的動態庫是/lib/x86_64-linux-gnu/libc.so.6,而如果該文件不存在,則運行時將會出錯。這里也可以參考《動態庫的制作和使用》。

查看符號表

新加的函數或者全局變量不知道有沒有編譯進去?如何看看符號表里有沒有吧(前提是符號表沒有被去掉):

$ nm hello |grep main  #符號表中查找main函數                  U __libc_start_main@@GLIBC_2.2.5 0000000000400526 T main

如果沒有找到或者前面是U,沒有地址,表明在這個elf文件中沒有定義這個函數。

鏈接出問題的時候很有用。

為ELF文件瘦身

前面通過file查看文件時,看到有not  stripped的字樣,由于它里面包含了一些符號表信息,因為文件會稍大,如果去掉,二進制文件將會變小,但是里面的符號表信息也就沒有了,將會影響問題定位。

$ ls -lh hello  #瘦身前 -rwxrwxr-x 1 root root 8.4K $ strip hello $ ls -lh hello #瘦身后 -rwxrwxr-x 1 root root 6.2K

可以看到,瘦身后二進制文件變得更小。當可執行文件越大時,瘦身效果就會更明顯了。當然放心,這不會影響程序的正常運行,只是對調試和問題定位有影響。

這個時候再看符號表:

$ nm hello nm: hello: no symbols

打印文件校驗和

二進制文件傳輸過程中有沒有被損壞或者是否是同一個版本,看看校驗和以及程序塊計數吧:

$ sum hello 33513     7

當然你也可以使用:

$ md5sum hello 521efed706c3b485dd3b5e96e48b138a  hello

來比對md5值。

感謝各位的閱讀!關于“linux中ELF文件的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荣成市| 西宁市| 和平区| 颍上县| 德阳市| 石首市| 化德县| 龙胜| 县级市| 彭州市| 兖州市| 抚州市| 赤峰市| 东平县| 安康市| 松原市| 沙坪坝区| 阿瓦提县| 额尔古纳市| 尼勒克县| 靖江市| 南川市| 石屏县| 穆棱市| 南阳市| 永州市| 滁州市| 广宗县| 和平区| 永平县| 长沙县| 汉寿县| 惠安县| 桓仁| 德格县| 广德县| 辛集市| 永福县| 专栏| 洛隆县| 金山区|