Linux 如何更改ELF中代码段的对齐方式

Linux 如何更改ELF中代码段的对齐方式,linux,gcc,clang,elf,Linux,Gcc,Clang,Elf,在ELF二进制文件中,如何更改可加载段的对齐方式? 在下面的示例中(请参见右角),我希望将0x200000减少到0x40960 LOAD 0x000000 0x000000400000 0x0000000000400000 0x000704 0x000704 R E **0x200000** LOAD 0x000e10 0x000000600e10 0x0000000000600e10 0x000230 0x000238 RW **0x200000** 任何编译器专家(GCC或c

在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 LOAD LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x0008c4 0x0008c4 R E 0x200000 LOAD 0x0008c8 0x00000000006008c8 0x00000000006008c8 0x000250 0x000260 RW 0x200000 $ gcc foo.c -Wl,-z,max-page-size=4096 && readelf -Wl ./a.out | grep LOAD LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x0008c4 0x0008c4 R E 0x1000 LOAD 0x0008c8 0x00000000004018c8 0x00000000004018c8 0x000250 0x000260 RW 0x1000 $gcc foo.c&&readelf-Wl./a.out | grep LOAD 加载0x0000000x00000000000400000 0x00000000000400000 0x00008C4 0x0008c4 R E 0x200000 加载0x0008c8 0x00000000006008c8 0x00000000006008c8 0x000250 0x000260 RW 0x200000 $gcc foo.c-Wl,-z,最大页面大小=4096&&readelf-Wl./a.out | grep LOAD 加载0x0000000x00000000000400000 0x00000000000400000 0x00008C4 0x0008c4 R E 0x1000 加载0x0008c8 0x00000000004018c8 0x00000000004018c8 0x000250 0x000260 RW 0x1000
显然,原因是链接器试图将这些段与体系结构(CPU?)上可用的最大页面大小对齐。x86上的标准默认页面大小为4KB,但存在更大的页面(如2MiB页面)。

ELF中程序头的对齐必须是2的幂。。。