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

在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

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

上一篇:element-ui分页器的使用-搭配表格


下一篇:c – 在Ubuntu 14.04下与`libopencv_highgui.so`链接错误,与`libtiff.so.5的奇怪结果