linux readelf命令.docx

上传人:b****6 文档编号:8505995 上传时间:2023-01-31 格式:DOCX 页数:17 大小:20.81KB
下载 相关 举报
linux readelf命令.docx_第1页
第1页 / 共17页
linux readelf命令.docx_第2页
第2页 / 共17页
linux readelf命令.docx_第3页
第3页 / 共17页
linux readelf命令.docx_第4页
第4页 / 共17页
linux readelf命令.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

linux readelf命令.docx

《linux readelf命令.docx》由会员分享,可在线阅读,更多相关《linux readelf命令.docx(17页珍藏版)》请在冰豆网上搜索。

linux readelf命令.docx

linuxreadelf命令

Linux命令学习手册-readelf命令

eadelfelf-file(s)

[功能]

用于显示elf格式文件的信息。

[描述]

readelf用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。

这里的elf-file(s)就表示那些被检查的文件。

可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。

这个程序和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。

运行readelf的时候,除了-v和-H之外,其它的选项必须有一个被指定。

ELF文件类型:

种类型的ELF文件:

a)可重定位文件:

用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。

b)可执行文件:

用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。

c)共享目标文件:

用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。

ELF文件作用:

ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件:

a)如果用于编译和链接(可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。

b)如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。

c)如果是共享文件,则两者都含有。

ELF文件总体组成:

elf文件头描述elf文件的总体信息。

包括:

系统相关,类型相关,加载相关,链接相关。

系统相关表示:

elf文件标识的魔术数,以及硬件和平台等相关信息,增加了elf文件的移植性,使交叉编译成为可能。

类型相关就是前面说的那个类型。

加载相关:

包括程序头表相关信息。

链接相关:

节头表相关信息。

项(分别以长格式和短格式给出了):

-a

--all显示全部信息,等价于-h-l-S-s-r-d-V-A-I.

-h

--file-header显示elf文件开始的文件头信息.

-l

--program-headers

--segments显示程序头(段头)信息(如果有的话)。

-S

--section-headers

--sections显示节头信息(如果有的话)。

-g

--section-groups显示节组信息(如果有的话)。

-t

--section-details显示节的详细信息(-S的)。

-s

--syms

--symbols显示符号表段中的项(如果有的话)。

-e

--headers显示全部头信息,等价于:

-h-l-S

-n

--notes显示note段(内核注释)的信息。

-r

--relocs显示可重定位段的信息。

-u

--unwind显示unwind段信息。

当前只支持IA64ELF的unwind段信息。

-d

--dynamic显示动态段的信息。

-V

--version-info显示版本段的信息。

-A

--arch-specific显示CPU构架信息。

-D

--use-dynamic使用动态段中的符号表显示符号,而不是使用符号段。

-x

--hex-dump=以16进制方式显示指定段内内容。

number指定段表中段的索引,或字符串指定文件中的段名。

-w[liaprmfFsoR]or

--debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges]

显示调试段中指定的内容。

-I

--histogram显示符号的时候,显示bucketlist长度的柱状图。

-v

--version显示readelf的版本信息。

-H

--help显示readelf所支持的命令行选项。

-W

--wide宽行输出。

@file可以将选项集中到一个文件中,然后使用这个@file选项载入。

[举例]

先给出如下例子:

1,对于可执行文件形式的elf格式文件:

1)查看可执行程序的源代码如下:

[quietheart@lv-kcppDemo]$catmain.cpp

#include

usingstd:

:

cout;

usingstd:

:

endl;

voidmy_print();

intmain(intargc,char*argv[])

{

my_print();

cout<<"hello!

"<

return0;

}

voidmy_print()

{

cout<<"print!

"<

}

2)编译如下:

[quietheart@lv-kcppDemo]$g++main.cpp-omain

[quietheart@lv-kcppDemo]$g++-gmain.cpp-omain.debug

3)编译之后,查看生成的文件:

[quietheart@lv-kcppDemo]$ls-l

总计64

-rwxr-xr-x1quietheartquietheart670007-0718:

04main

-rw-r--r--1quietheartquietheart20107-0718:

02main.cpp

-rwxr-xr-x1quietheartquietheart3893207-0718:

04main.debug

这里,main.debug是带有调试信息的可执行文件,main是一般的可执行文件。

2,对于库文件形式的elf格式文件:

1)查看库的源代码如下:

//myfile.h

#ifndef__MYFILE_H

#define__MYFILE_H

voidprintInfo();

#endif

//myfile.cpp

#include"myfile.h"

#include

usingstd:

:

cout;

usingstd:

:

endl;

voidprintInfo()

{

cout<<"hello"<

}

2)编译如下:

[quietheart@lv-kbak]$g++-cmyfile.cpp

[quietheart@lv-kbak]$g++-shared-fPCI-olibmy.somyfile.o

[quietheart@lv-kbak]$ar-rlibmy.amyfile.o

ar:

creatinglibmy.a

3)编译之后,查看生成的文件:

[quietheart@lv-kbak]$ls-l

总计44

-rw-r--r--1quietheartquietheart215407-0816:

14libmy.a

-rwxr-xr-x1quietheartquietheart570707-0816:

08libmy.so

-rwxr-xr-x1quietheartquietheart11707-0816:

06myfile.cpp

-rwxr-xr-x1quietheartquietheart6307-0816:

08myfile.h

-rw-r--r--1quietheartquietheart200407-0816:

08myfile.o

libmy.alibmy.somyfile.cppmyfile.hmyfile.o

这里,分别生成目标文件myfile.o,共享库文件libmy.so,和静态库文件libmy.a。

基于以上可执行文件和库,这里给出一些常用的命令。

*读取可执行文件形式的elf文件头信息:

[quietheart@lv-kcppDemo]$readelf-hmain

输入之后,输出信息如下:

ELFHeader:

Magic:

7f454c46010101000000000000000000

Class:

ELF32

Data:

2'scomplement,littleendian

Version:

1(current)

OS/ABI:

UNIX-SystemV

ABIVersion:

0

Type:

EXEC(Executablefile)

Machine:

Intel80386

Version:

0x1

Entrypointaddress:

0x8048580

Startofprogramheaders:

52(bytesintofile)

Startofsectionheaders:

3232(bytesintofile)

Flags:

0x0

Sizeofthisheader:

52(bytes)

Sizeofprogramheaders:

32(bytes)

Numberofprogramheaders:

8

Sizeofsectionheaders:

40(bytes)

Numberofsectionheaders:

29

Sectionheaderstringtableindex:

26

这里,可见可执行文件的elf文件,其类型为EXEC(可执行文件)。

另外,含调试信息的"main.debug"和不含调试信息的"main"除了一些大小信息之外,其内容是一样的。

并且由此可见文件的体系结构为Intel80386。

*读取目标文件形式的elf文件头信息:

[quietheart@lv-kbak]$readelf-hmyfile.o

输入之后,输出信息大致如下:

ELFHeader:

Magic:

7f454c46010101000000000000000000

Class:

ELF32

Data:

2'scomplement,littleendian

Version:

1(current)

OS/ABI:

UNIX-SystemV

ABIVersion:

0

Type:

REL(Relocatablefile)

Machine:

Intel80386

Version:

0x1

Entrypointaddress:

0x0

Startofprogramheaders:

0(bytesintofile)

Startofsectionheaders:

516(bytesintofile)

Flags:

0x0

Sizeofthisheader:

52(bytes)

Sizeofprogramheaders:

0(bytes)

Numberofprogramheaders:

0

Sizeofsectionheaders:

40(bytes)

Numberofsectionheaders:

15

Sectionheaderstringtableindex:

12

这里,可见目标文件的elf文件,其类型为REL(可重定位文件)。

*读取静态库文件形式的elf文件头信息:

[quietheart@lv-kbak]$readelf-hlibmy.a

输入之后,输出信息大致如下:

File:

libmy.a(myfile.o)

ELFHeader:

Magic:

7f454c46010101000000000000000000

Class:

ELF32

Data:

2'scomplement,littleendian

Version:

1(current)

OS/ABI:

UNIX-SystemV

ABIVersion:

0

Type:

REL(Relocatablefile)

Machine:

Intel80386

Version:

0x1

Entrypointaddress:

0x0

Startofprogramheaders:

0(bytesintofile)

Startofsectionheaders:

516(bytesintofile)

Flags:

0x0

Sizeofthisheader:

52(bytes)

Sizeofprogramheaders:

0(bytes)

Numberofprogramheaders:

0

Sizeofsectionheaders:

40(bytes)

Numberofsectionheaders:

15

Sectionheaderstringtableindex:

12

这里,可见静态库文件的elf文件,其类型为REL(可重定位文件)。

*读取动态库文件形式的elf文件头信息:

[quietheart@lv-kbak]$readelf-hlibmy.so

ELFHeader:

Magic:

7f454c46010101000000000000000000

Class:

ELF32

Data:

2'scomplement,littleendian

Version:

1(current)

OS/ABI:

UNIX-SystemV

ABIVersion:

0

Type:

DYN(Sharedobjectfile)

Machine:

Intel80386

Version:

0x1

Entrypointaddress:

0x550

Startofprogramheaders:

52(bytesintofile)

Startofsectionheaders:

2768(bytesintofile)

Flags:

0x0

Sizeofthisheader:

52(bytes)

Sizeofprogramheaders:

32(bytes)

Numberofprogramheaders:

5

Sizeofsectionheaders:

40(bytes)

Numberofsectionheaders:

27

Sectionheaderstringtableindex:

24

这里,可见动态库文件的elf文件,其类型为DYN(共享目标文件)。

*查看可执行的elf文件程序头表信息:

[quietheart@lv-kcppDemo]$readelf-lmain

输入之后,输出信息如下:

ElffiletypeisEXEC(Executablefile)

Entrypoint0x8048580

Thereare8programheaders,startingatoffset52

ProgramHeaders:

TypeOffsetVirtAddrPhysAddrFileSizMemSizFlgAlign

PHDR0x0000340x080480340x080480340x001000x00100RE0x4

INTERP0x0001340x080481340x080481340x000130x00013R0x1

[Requestingprograminterpreter:

/lib/ld-linux.so.2]

LOAD0x0000000x080480000x080480000x009700x00970RE0x1000

LOAD0x0009700x080499700x080499700x001300x001c8RW0x1000

DYNAMIC0x0009880x080499880x080499880x000e00x000e0RW0x4

NOTE0x0001480x080481480x080481480x000200x00020R0x4

GNU_EH_FRAME0x0008200x080488200x080488200x000440x00044R0x4

GNU_STACK0x0000000x000000000x000000000x000000x00000RW0x4

SectiontoSegmentmapping:

SegmentSections...

00

01.interp

02.interp.note.ABI-tag.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.plt.text.fini.rodata.eh_frame_hdr.eh_frame

03.ctors.dtors.jcr.dynamic.got.got.plt.data.bss

04.dynamic

05.note.ABI-tag

06.eh_frame_hdr

07

这里,含调试信息的"main.debug"和不含调试信息的"main"其内容是一样的。

*查看目标文件的elf文件程序头表信息:

[quietheart@lv-kbak]$readelf-lmyfile.o

输入之后,输出信息类似如下:

Therearenoprogramheadersinthisfile.

这里可知,可重定位的目标文件,它没程序头表。

*查看静态库文件的elf文件程序头表信息:

[quietheart@lv-kbak]$readelf-llibmy.a

输入之后,输出信息类似如下:

File:

libmy.a(myfile.o)

Therearenoprogramheadersinthisfile.

这里可知,可重定位的静态库文件,它没程序头表。

*查看动态库文件的elf文件程序头表信息:

[quietheart@lv-kbak]$readelf-llibmy.so

ElffiletypeisDYN(Sharedobjectfile)

Entrypoint0x550

Thereare5programheaders,startingatoffset52

ProgramHeaders:

TypeOffsetVirtAddrPhysAddrFileSizMemSizFlgAlign

LOAD0x0000000x000000000x000000000x007f40x007f4RE0x1000

LOAD0x0007f40x000017f40x000017f40x0011c0x00128RW0x1000

DYNAMIC0x0008100x000018100x000018100x000e00x000e0RW0x4

GNU_EH_FRAME0x0007380x000007380x000007380x0002c0x0002cR0x4

GNU_STACK0x0000000x000000000x000000000x000000x00000RW0x4

SectiontoSegmentmapping:

SegmentSections...

00.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.plt.text.fini.rodata.eh_frame_hdr.eh_frame

01.ctors.dtors.jcr.data.rel.ro.dynamic.got.got.plt.bss

02.dynamic

03.eh_frame_hdr

04

这里可知,做为共享目标文件的动态库,它程序头表。

*查看一个可执行的elf文件的节信息:

[quietheart@lv-kcppDemo]$readelf-Smain

输入之后,输出信息如下:

Thereare29sectionheaders,startingatoffset0xca0:

SectionHeaders:

[Nr]NameTypeAddrOffSizeESFlgLkInfAl

[0]NULL0000000000000000000000000

[1].interpPROGBITS0804813400013400001300A001

[2].note.ABI-tagNOTE0804814800014800002000A004

[3].gnu.hashGNU_HASH0804816800016800003004A404

[4].dynsymDYNSYM080481980001980000d010A514

[5].dynstrSTRTAB0804826800026800018300A001

[6].gnu.versionVERSYM080483ec0003ec00001a02A402

[7].gnu.version_rVERNEED080484080004080000600

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1