我正在研究我的 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 的开始位置。