我正在研究我的 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()?
输出中的标志是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)
所以要点是:
gdb,因此函数将具有有意义的名称最后一行,起始地址...,正如您所猜测的那样,是可执行文件的实际 .CODE 的开始位置。
| 归档时间: |
|
| 查看次数: |
2215 次 |
| 最近记录: |