ELF(Executable and Linking Format)是一个定义了目标文件内部信息如何组成和组织的文件格式。内核会根据这些信息加载可执行文件,内核根据这些信息能够知道从文件哪里获取代码,从哪里获取初始化数据,在哪里应该加载共享库,等信息。linux
ELF文件主要三种文件类型,具体参考(https://blog.csdn.net/zl6481033/article/details/84990262)。bash
那么从ELF文件上能够获得什么信息,在linux上有一个GNU软件,能够查看目标文件内容。咱们获得一个可执行文件,能够采用指令 readelf -h a.out 来查看其信息。ide
有关readelf指令使用以下:函数
NAME readelf - Displays information about ELF files. SYNOPSIS readelf [-a|--all] [-h|--file-header] [-l|--program-headers|--segments] [-S|--section-headers|--sections] [-g|--section-groups] [-t|--section-details] [-e|--headers] [-s|--syms|--symbols] [--dyn-syms] [-n|--notes] [-r|--relocs] [-u|--unwind] [-d|--dynamic] [-V|--version-info] [-A|--arch-specific] [-D|--use-dynamic] [-x <number or name>|--hex-dump=<number or name>] [-p <number or name>|--string-dump=<number or name>] [-R <number or name>|--relocated-dump=<number or name>] [-z|--decompress] [-c|--archive-index] [-w[lLiaprmfFsoRt]| --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]] [--dwarf-depth=n] [--dwarf-start=n] [-I|--histogram] [-v|--version] [-W|--wide] [-H|--help]
可执行文件分析以下:.net
从上图中头部信息能够获得不少信息,根据Class、Machine、Type能够知道这个文件是在x86-64位机器上可执行文件,根据Entry point address 知道程序启动是从虚拟地址0x4003e0开始运行,这个地址并非main的地址,而是_start函数地址,_start函数是连接器建立的,为了初始化程序。number of program header 程序有9个段, Number of section headers 程序有31个区,区中的信息是用来将连接使用的,主要包括程序代码、程序数据、重定向信息等。、debug
查看区的信息能够使用:readelf -S a.out。code
更多内容参考(https://blog.csdn.net/linux_ever/article/details/78210089)。orm