在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 R E 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 R E 0x1000
负载0x0008c8 0x00000000004018c8 0x00000000004018c8 0x000250 0x000260 RW 0x1000

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

关于linux - 如何在ELF中更改代码段的对齐方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33005638/

10-10 03:37