文件头的部分

Aru*_*mar 5 c executable elf

我正在研究我的 C 程序,我是 Linux/UNIX 开发的新手,正在四处看看。

我创建了一个简单的 Hello world C 程序,并正在检查编译过程。

我试图读取最终可执行文件的文件头并得到输出如下

$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**
Run Code Online (Sandbox Code Playgroud)

我了解 elf32-i386 部分,但我不太确定标题的其他部分。

D_PAGED与需求分页有某种关系吗?是什么 EXEC_P, HAS_SYSMS意思?是起始地址,程序的逻辑地址main()

slm*_*slm 1

输出中的标志是BFD - 二进制文件描述符/usr/include/bfd.h它们是 binutils 包的一部分,如果您在 bfd 头文件中查找它们的含义或在此处查看这些标志的含义,您可以了解它们的含义。

对“标志” 0x00000112 的引用就是所谓的标志字段。它是二进制的,每一位代表一个特定的功能,1 表示标志打开或设置,0 表示标志未打开或设置。另请注意,“0x...”表示它是一个十六进制值,因此如果将其从 HEX 转换为 BIN:

0x00000112 = 0001 0001 0010 二进制。

这样就设置了标志字段中第2、5、9位对应的标志。这些是在命令输出的第三行中按名称显示的标志objdump

标志的含义

您的可执行文件具有的 3 个标志是非常标准的。从右到左读取这些位!

第 1 位 - 0000 0000 0010

  /* BFD is directly executable.  */
#define EXEC_P         0x02
Run Code Online (Sandbox Code Playgroud)

第 2 位 - 0000 0001 0000

  /* BFD has symbols.  */
#define HAS_SYMS       0x10
Run Code Online (Sandbox Code Playgroud)

第三位 - 0001 0000 0000

  /* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
     linker sets this by default, but clears it for -r or -n or -N).  */
#define D_PAGED        0x100
Run Code Online (Sandbox Code Playgroud)

所以要点是:

  • 这是一个可执行文件
  • 如果您想使用 Gnu 调试器对其进行调试,它包含一个符号表gdb,因此函数将具有有意义的名称
  • 可执行文件动态链接到标准库,例如 glibc 等。

起始地址

最后一行,起始地址...,正如您所猜测的那样,是可执行文件的实际 .CODE 的开始位置。