How to change alignment of code segment in ELF

2019-02-15 18:41发布

问题:

In ELF binary, how to change the alignment of loadable segments? In the below example (See right corner), I want to reduce the 0x200000 to 0x40960.

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

Can any compiler expert (GCC or clang), provide me a solution for this?

回答1:

I don't know I you really want to do that but you can change the max page size with 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

Apparently, the reason is that the linker tries to align the segments to the maximum page size available on you architecture (on you CPU?). The standard default page size is 4KiB on x86 but greater pages exist (such as 2MiB pages).