真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux中ELF文件的示例分析

這篇文章給大家分享的是有關(guān)linux中ELF文件的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比遼中網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式遼中網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋遼中地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴(lài)。

示例程序

我們的示例程序如下:

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

編譯:

$ gcc -o hello hello.c

得到hello可執(zhí)行文件。

查看文件類(lèi)型

file命令可以用來(lái)查看文件類(lèi)型:

$ 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

從結(jié)果中,我們可以知道,它是ELF可執(zhí)行文件,且是64位程序,有動(dòng)態(tài)鏈接,最后的not stripped也表明了它保留了符號(hào)表信息或者調(diào)試信息。

如果不是可執(zhí)行文件,它的信息是怎樣的呢?舉個(gè)例子:

$ 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,即可執(zhí)行文件,且小端程序,運(yùn)行于X86-64。在交叉編譯的時(shí)候,這個(gè)文件頭的信息也非常有用。例如你在x86的機(jī)器上交叉編譯出powerpc的可執(zhí)行文件,在powerpc上卻不被識(shí)別,不能運(yùn)行,不如用readelf看看它的Machine字段,是不是沒(méi)有編譯好。

查找ELF文件中的字符串

例如,你在文件中寫(xiě)入了版本號(hào)或者特殊字符串,可以通過(guò)strings命令搜索到:

$ strings hello|grep shouwang hello shouwangxiansheng

查看ELF文件各段大小

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

這里可以看到代碼段,數(shù)據(jù)段各自占多少,必要時(shí)候還可以根據(jù)需要優(yōu)化代碼,減少磁盤(pán)空間占用。

查看鏈接的動(dòng)態(tài)庫(kù)

運(yùn)行時(shí)出現(xiàn)找不到動(dòng)態(tài)庫(kù)?不如看看它鏈接了哪些庫(kù)吧:

$ 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)

可以看到它鏈接的動(dòng)態(tài)庫(kù)是/lib/x86_64-linux-gnu/libc.so.6,而如果該文件不存在,則運(yùn)行時(shí)將會(huì)出錯(cuò)。這里也可以參考《動(dòng)態(tài)庫(kù)的制作和使用》。

查看符號(hào)表

新加的函數(shù)或者全局變量不知道有沒(méi)有編譯進(jìn)去?如何看看符號(hào)表里有沒(méi)有吧(前提是符號(hào)表沒(méi)有被去掉):

$ nm hello |grep main  #符號(hào)表中查找main函數(shù)                  U __libc_start_main@@GLIBC_2.2.5 0000000000400526 T main

如果沒(méi)有找到或者前面是U,沒(méi)有地址,表明在這個(gè)elf文件中沒(méi)有定義這個(gè)函數(shù)。

鏈接出問(wèn)題的時(shí)候很有用。

為ELF文件瘦身

前面通過(guò)file查看文件時(shí),看到有not  stripped的字樣,由于它里面包含了一些符號(hào)表信息,因?yàn)槲募?huì)稍大,如果去掉,二進(jìn)制文件將會(huì)變小,但是里面的符號(hào)表信息也就沒(méi)有了,將會(huì)影響問(wèn)題定位。

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

可以看到,瘦身后二進(jìn)制文件變得更小。當(dāng)可執(zhí)行文件越大時(shí),瘦身效果就會(huì)更明顯了。當(dāng)然放心,這不會(huì)影響程序的正常運(yùn)行,只是對(duì)調(diào)試和問(wèn)題定位有影響。

這個(gè)時(shí)候再看符號(hào)表:

$ nm hello nm: hello: no symbols

打印文件校驗(yàn)和

二進(jìn)制文件傳輸過(guò)程中有沒(méi)有被損壞或者是否是同一個(gè)版本,看看校驗(yàn)和以及程序塊計(jì)數(shù)吧:

$ sum hello 33513     7

當(dāng)然你也可以使用:

$ md5sum hello 521efed706c3b485dd3b5e96e48b138a  hello

來(lái)比對(duì)md5值。

感謝各位的閱讀!關(guān)于“l(fā)inux中ELF文件的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


分享標(biāo)題:linux中ELF文件的示例分析
標(biāo)題網(wǎng)址:http://weahome.cn/article/pchegc.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部