我想了解ELF格式,现在有一些东西我没有得到关于在程序头中定义的段。我有这个小代码,我转换为一个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
随着祝福十六进制编辑器我在看代码,并试图找到这些片段中的每一个。
我在ELF标题后面找到了PHDR段,它的大小是整个程序头的大小。它有一个8字节的队列,可读/可执行。 [!]我不明白为什么可执行。
我在PHDR后面找到声明解释器的段。它具有解释器路径的大小和1个字节的对齐。正确
现在我有一个段是可读和可执行文件,[!] 我想是的代码段。我不明白为什么它从0x0000000000000000开始。不应该从入口点位置开始吗?为什么它有一个0xafc字节的大小?大小不只是代码的大小?有多少文件是可执行的?另外,我不明白为什么对齐是0x200000字节。是否为内存中的LOAD段保留了多少空间?。这是本段结束,并且764个
0x0
字节的大写金额如下它:
- 下一个(可读写)我想是其中变量存储的段[!]。它结束的地方就像节标题可能开始。
- 现在下一个是DYNAMIC标题。它从0xe18开始,位于上面的内部。 [!] 我认为这是一个段,其中存储对外部函数和变量的引用,但我不确定。它是可读写的。我只是不知道什么段是这样,为什么它是“内部” LOAD段以上
- 注段,包含一些信息,我想并不重要,现在
- GNU特定部分,一个他们有任何偏移和大小等于
0x0000000000000000
,其他人干扰其他部分,我不明白,或者。
我来自PE的世界里,每一件事情都定义了它自己以及偏移和大小,在这里我看到这些奇怪的地址和大小,我感到困惑。
更清晰了。这真的有帮助。非常感谢。 – ali