c - readelf 'Align' 列单元
问题描述
我有以下简单的“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
列感到困惑:这些数字是字节还是千字节?我认为对齐应该等于页面大小。为什么我得到那些号码?
谢谢!
解决方案
这就是System V 应用程序二进制接口所说的p_align
:
值 0 和 1 表示不需要对齐。否则,p_align 应该是 2 的正整数幂,并且 p_vaddr 应该等于 p_offset,以 p_align 为模。
所以p_align
不需要等于页面大小。
推荐阅读
- javascript - 带有 await Promise.all() 的代码不会继续执行
- python - 所有字符串列表到一个 numpy 浮点数组
- ios - 如何使用 Stencil 和 Cover 方法用金属 ios 绘制 SVG?
- docker - 使用 Docker 密钥访问 Jenkinsfile 中的数据库
- android - 谷歌地图插件在显示时会导致 Flutter 应用崩溃
- twine-game-engine - Sugarcube 使随机图像出现
- python - 在 pyomo 中创建具有稀疏索引的变量
- java - Java应用程序:连接到私人比特币节点的问题
- c# - 将枚举添加到特定类 c# 的列表中
- javafx - 类,groovy FX和调用self