https://sourceware.org/bugzilla/show_bug.cgi?id=27566
Nelson Chu <nelsonc1225 at sourceware dot org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |nelsonc1225 at sourceware dot org --- Comment #1 from Nelson Chu <nelsonc1225 at sourceware dot org> --- Hi Lifang, thanks for reporting this. I'm really curious how this happened, so I spend some times to research how DATA_SEGMENT_ALIGN and DATA_SEGMENT_RELRO_END work in the current GNU linker. Consider the binutils doc, * DATA_SEGMENT_ALIGN(maxpagesize, commonpagesize) = [maxpagesize == commonpagesize] (ALIGN(maxpagesize) + (. & (maxpagesize - 1))) [maxpagesize != commonpagesize] (ALIGN(maxpagesize) + ((. + commonpagesize - 1) & (maxpagesize - commonpagesize))) * DATA_SEGMENT_RELRO_END(offset, exp) When ‘-z relro’ option is not present, DATA_SEGMENT_RELRO_END does nothing, otherwise DATA_SEGMENT_ALIGN is padded so that exp + offset is aligned to the commonpagesize argument given to DATA_SEGMENT_ALIGN. I only consider the default linker script here. Besides, I do some minor changes to your original example, to see how the DATA_*_ALIGN work. nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ cat tmp.s .option nopic .section .rodata .align 10 .globl hello_rodata hello_rodata: .zero 0x10 .section .init_array .globl padding_init_array padding_init_array: .zero 0xfc .text .align 1 .globl main main: lui a5,%hi(hello_rodata) addi a5,a5,%lo(hello_rodata) nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ ~/binutils-dev/build-linux64-upstream/build-install/bin/riscv64-unknown-linux-gnu-as tmp.s -o tmp.o Therefore, consider four cases as follows, 1. norelro, maxpagesize=0x1000, commonpagesize=0x1000 nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ ~/binutils-dev/build-linux64-upstream/build-install/bin/riscv64-unknown-linux-gnu-ld -z norelro -z max-page-size=0x1000 -z common-page-size=0x1000 tmp.o -M > map1 nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ cat map1 ... .rodata 0x0000000000010400 0x10 *(.rodata .rodata.* .gnu.linkonce.r.*) .rodata 0x0000000000010400 0x10 tmp.o 0x0000000000010400 hello_rodata ... 0x0000000000011410 . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)) ... .init_array 0x0000000000011410 0xfc ... 0x000000000001150c . = DATA_SEGMENT_RELRO_END (., 0x0) .data 0x000000000001150c 0x0 ... DATA_SEGMENT_ALIGN should be (ALIGN(0x1000) + (0x10410 & (0x1000 - 1))) = 0x11000 + (0x10410 & 0xfff) = 0x11410 And DATA_SEGMENT_RELRO_END = 0x11410 + 0xfc = 0x1150c. So we need to reserve at most "MAXPAGESIZE" size. 2. relro, maxpagesize=0x1000, commonpagesize=0x1000 nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ ~/binutils-dev/build-linux64-upstream/build-install/bin/riscv64-unknown-linux-gnu-ld -z relro -z max-page-size=0x1000 -z common-page-size=0x1000 tmp.o -M > map2 nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ cat map2 ... .rodata 0x0000000000010400 0x10 *(.rodata .rodata.* .gnu.linkonce.r.*) .rodata 0x0000000000010400 0x10 tmp.o 0x0000000000010400 hello_rodata ... 0x0000000000011f04 . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)) ... .init_array 0x0000000000011f04 0xfc ... 0x0000000000012000 . = DATA_SEGMENT_RELRO_END (., 0x0) ... This is same as above, but since "-z relro", DATA_SEGMENT_RELRO_END = ALIGN(0x1150c, 0x1000) = 0x12000 DATA_SEGMENT_ALIGN = 0x12000 - 0xfc = 0x11f04 So we need to reserve at most "MAXPAGESIZE + COMMONPAGESIZE" size = "2*MAXPAGESIZE". 3. norelro, maxpagesize=0x10000, commonpagesize=0x2000 nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ ~/binutils-dev/build-linux64-upstream/build-install/bin/riscv64-unknown-linux-gnu-ld -z norelro -z max-page-size=0x10000 -z common-page-size=0x2000 tmp.o -M > map3 nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ cat map3 ... .rodata 0x0000000000010400 0x10 *(.rodata .rodata.* .gnu.linkonce.r.*) .rodata 0x0000000000010400 0x10 tmp.o 0x0000000000010400 hello_rodata ... 0x0000000000020410 . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)) ... .init_array 0x0000000000020410 0xfc ... 0x000000000002050c . = DATA_SEGMENT_RELRO_END (., 0x0) ... DATA_SEGMENT_ALIGN = (ALIGN(0x10000) + (0x10410 & (0x2000 - 1))) = 0x20000 + (0x10410 & 0x1fff) = 0x20410 DATA_SEGMENT_RELRO_END = 0x20410 + 0xfc = 0x2050c. So we need to reserve at most "MAXPAGESIZE" size. 4. relro, maxpagesize=0x10000, commonpagesize=0x2000 nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ ~/binutils-dev/build-linux64-upstream/build-install/bin/riscv64-unknown-linux-gnu-ld -z relro -z max-page-size=0x10000 -z common-page-size=0x2000 tmp.o -M > map4 nelson@LAPTOP-QFSGI1F2:~/test/pr27566$ cat map4 ... .rodata 0x0000000000010400 0x10 *(.rodata .rodata.* .gnu.linkonce.r.*) .rodata 0x0000000000010400 0x10 tmp.o 0x0000000000010400 hello_rodata ... 0x0000000000021f04 . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)) ... .init_array 0x0000000000021f04 0xfc ... 0x0000000000022000 . = DATA_SEGMENT_RELRO_END (., 0x0) ... DATA_SEGMENT_RELRO_END = ALIGN(0x20410, 0x2000) = 0x22000 DATA_SEGMENT_ALIGN = 0x22000 - 0xfc = 0x21f04 So we need to reserve at most "MAXPAGESIZE + COMMONPAGESIZE" size. -- You are receiving this mail because: You are on the CC list for the bug.