在ELF二进制文件中,如何更改可加载段的对齐方式? 在下面的示例中(见右上角),我想将 0x200000 减少到 0x40960。
LOAD 0x000000 0x000000400000 0x0000000000400000 0x000704 0x000704 R E **0x200000**
LOAD 0x000e10 0x000000600e10 0x0000000000600e10 0x000230 0x000238 RW **0x200000**
任何编译器专家(GCC 或 clang)都可以为此提供解决方案吗?
我不知道你是否真的想这样做,但你可以使用
ld -z max-page-size=4096
: 更改最大页面大小
$ gcc foo.c && readelf -Wl ./a.out | grep 负载 加载 0x000000 0x0000000000400000 0x0000000000400000 0x0008c4 0x0008c4 读 0x200000 加载0x0008c8 0x00000000006008c8 0x00000000006008c8 0x000250 0x000260 RW 0x200000 $ gcc foo.c -Wl,-z,max-page-size=4096 && readelf -Wl ./a.out | grep 负载 加载 0x000000 0x0000000000400000 0x0000000000400000 0x0008c4 0x0008c4 读 0x1000 加载 0x0008c8 0x00000000004018c8 0x00000000004018c8 0x000250 0x000260 读写 0x1000
显然,原因是链接器尝试将段与您的架构(在您的 CPU 上?)上可用的最大页面大小对齐。 x86 上的标准默认页面大小为 4KiB,但存在更大的页面(例如 2MiB 页面)。