我有下面这个简单的"hello world“程序:
#include <stdio.h>
int main() {
printf("Hello world.\n");
return 0;
}我将它编译为
gcc -static -O0 -g -std=gnu11 -o test_helloworld test_helloworld.c -lpthread现在,我想通过发出readelf -l命令来检查它的内存段,并获得以下输出:
Elf file type is EXEC (Executable file)
Entry point 0x400890
There are 6 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000c96cf 0x00000000000c96cf R E 200000
LOAD 0x00000000000c9eb8 0x00000000006c9eb8 0x00000000006c9eb8
0x0000000000001c98 0x00000000000035b0 RW 200000
NOTE 0x0000000000000190 0x0000000000400190 0x0000000000400190
0x0000000000000044 0x0000000000000044 R 4
TLS 0x00000000000c9eb8 0x00000000006c9eb8 0x00000000006c9eb8
0x0000000000000020 0x0000000000000050 R 8
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x00000000000c9eb8 0x00000000006c9eb8 0x00000000006c9eb8
0x0000000000000148 0x0000000000000148 R 1我被Align列搞糊涂了:这些数字是以字节还是千字节为单位的?我认为align应该等于页面大小。为什么我会得到这些数字?
谢谢!
发布于 2019-11-13 01:49:01
这就是System V Application Binary Interface对p_align的评价
值0和1表示不需要对齐。否则,p_align应该是2的正整数幂,并且p_vaddr应该等于p_offset,模为p_align。
所以p_align不需要等于页面大小。
https://stackoverflow.com/questions/55411260
复制相似问题