文件头的部分

文件头的部分

我正在研究我的 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**

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

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

答案1

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

对“标志”的引用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

第 2 位 - 0000 0001 0000

  /* BFD has symbols.  */
#define HAS_SYMS       0x10

第三位 - 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

所以要点是:

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

起始地址

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

相关内容