【发布时间】:2014-03-21 05:51:51
【问题描述】:
我正在尝试理解 ELF 格式,但现在对于程序头中定义的段,有些事情我不明白。我有这个小代码,我用 g++(Linux 上的 x86_x64)转换为 ELF 文件:
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
if (argc == 1)
{
cout << "Hello world!" << endl;
}
return 0;
}
使用g++ -c -m64 -D ACIS64 main.cpp -o main.o 和g++ -s -O1 -o Main main.o。
现在,通过 readelf 我得到了这个片段列表:
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000afc 0x0000000000000afc R E 200000
LOAD 0x0000000000000df8 0x0000000000600df8 0x0000000000600df8
0x0000000000000270 0x00000000000003a0 RW 200000
DYNAMIC 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x00000000000001e0 0x00000000000001e0 RW 8
NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4
GNU_EH_FRAME 0x00000000000009a4 0x00000000004009a4 0x00000000004009a4
0x0000000000000044 0x0000000000000044 R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x0000000000000df8 0x0000000000600df8 0x0000000000600df8
0x0000000000000208 0x0000000000000208 R 1
使用 Bless Hex Editor 我正在查看代码并尝试找到其中的每一个。
我发现 PHDR 段就在 ELF 标头之后,并且具有整个程序标头的大小。它具有 8 个字节的对齐方式,并且是可读/可执行的。 [!]我不明白为什么是可执行文件。
我找到了声明解释器的段,就在 PHDR 之后。它具有解释器路径的大小和 1 个字节的对齐方式。正确
现在我有一个可读和可执行的段,[!]我想是代码段。我不明白为什么它从 0x0000000000000000 开始。这不应该从入口点所在的位置开始吗?为什么它的大小为 0xafc 字节?大小不只是代码的大小吗?有多少文件是可执行的?另外,我不明白为什么对齐是 0x200000 字节。那是为内存中的 LOAD 段保留了多少空间?。这是该段结束的地方,后面有 764 个
0x0字节:- 下一个(可读和可写)[!]我想是一个存储变量的段。它在节标题可能开始的地方结束。
- 现在下一个是动态标题。它从 0xe18 开始,在上面的那个里面。 [!]我认为这是一个存储对外部函数和变量的引用的段,但我不确定。它是可读可写的。我只是不知道这是什么段以及为什么它在上面的 LOAD 段“内部”
- 一个 NOTE 片段,包含一些我认为现在不重要的信息
- GNU 特定段,其中一个具有任何偏移量和大小等于
0x0000000000000000,其他的会干扰其他段,我也不明白。
我来自 PE 世界,每个事物都有自己明确定义的偏移量和大小,在这里我看到这些奇怪的地址和大小,我很困惑。
【问题讨论】:
标签: header size offset elf segment