Message ID | 20230502074105.1541926-1-maskray@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3] arm64: lds: move .got section out of .text | expand |
On Tue, 2 May 2023 07:41:05 +0000, Fangrui Song wrote: > Currently, the .got section is placed within the output section .text. > However, when .got is non-empty, the SHF_WRITE flag is set for .text > when linked by lld. GNU ld recognizes .text as a special section and > ignores the SHF_WRITE flag. By renaming .text, we can also get the > SHF_WRITE flag. > > The kernel has performed R_AARCH64_RELATIVE resolving very early, and can > then assume that .got is read-only. Let's move .got to the vmlinux_rodata > pseudo-segment. > > [...] Applied to arm64 (for-next/core), thanks! [1/1] arm64: lds: move .got section out of .text https://git.kernel.org/arm64/c/0fddb79bf283 Cheers,
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S index b9202c2ee18e..3cd7e76cc562 100644 --- a/arch/arm64/kernel/vmlinux.lds.S +++ b/arch/arm64/kernel/vmlinux.lds.S @@ -181,10 +181,17 @@ SECTIONS KPROBES_TEXT HYPERVISOR_TEXT *(.gnu.warning) - . = ALIGN(16); - *(.got) /* Global offset table */ } + . = ALIGN(SEGMENT_ALIGN); + _etext = .; /* End of text section */ + + /* everything from this point to __init_begin will be marked RO NX */ + RO_DATA(PAGE_SIZE) + + HYPERVISOR_DATA_SECTIONS + + .got : { *(.got) } /* * Make sure that the .got.plt is either completely empty or it * contains only the lazy dispatch entries. @@ -193,14 +200,6 @@ SECTIONS ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!") - . = ALIGN(SEGMENT_ALIGN); - _etext = .; /* End of text section */ - - /* everything from this point to __init_begin will be marked RO NX */ - RO_DATA(PAGE_SIZE) - - HYPERVISOR_DATA_SECTIONS - /* code sections that are never executed via the kernel mapping */ .rodata.text : { TRAMP_TEXT