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?
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).