【问题标题】:How to change alignment of code segment in ELF如何更改 ELF 中代码段的对齐方式
【发布时间】:2016-01-05 11:26:02
【问题描述】:

在 ELF 二进制文件中,如何更改可加载段的对齐方式? 在下面的示例中(见右上角),我想将 0x200000 减少到 0x40960。

  LOAD  0x000000 0x000000400000 0x0000000000400000 0x000704 0x000704 R E **0x200000**
  LOAD  0x000e10 0x000000600e10 0x0000000000600e10 0x000230 0x000238 RW  **0x200000**

任何编译器专家(GCC 或 clang)都可以为我提供解决方案吗?

【问题讨论】:

  • ELF 中程序头的对齐方式必须是 2 的幂...

标签: linux gcc clang elf


【解决方案1】:

我不知道您是否真的想这样做,但您可以使用 ld -z max-page-size=4096 更改最大页面大小:

$ gcc foo.c && readelf -Wl ./a.out | grep 加载
加载 0x000000 0x0000000000400000 0x0000000000400000 0x0008c4 0x0008c4 R E 0x200000
加载 0x0008c8 0x00000000006008c8 0x00000000006008c8 0x000250 0x000260 读写 0x200000
$ gcc foo.c -Wl,-z,max-page-size=4096 && readelf -Wl ./a.out | grep 加载
加载 0x000000 0x0000000000400000 0x0000000000400000 0x0008c4 0x0008c4 R E 0x1000
加载 0x0008c8 0x00000000004018c8 0x00000000004018c8 0x000250 0x000260 读写 0x1000

显然,原因是链接器试图将段对齐到您的体系结构上可用的最大页面大小(在您的 CPU 上?)。 x86 上的标准默认页面大小为 4KiB,但存在更大的页面(例如 2MiB 页面)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多