Message ID | 20200305183939.256241-1-davidgow@google.com |
---|---|
State | Accepted |
Headers | show |
Series | um: Fix overlapping ELF segments when statically linked | expand |
On Thu, Mar 5, 2020 at 10:39 AM David Gow <davidgow@google.com> wrote: > > When statically linked, the .text section in UML kernels is not page > aligned, causing it to share a page with the executable headers. As > .text and the executable headers have different permissions, this causes > the kernel to wish to map the same page twice (once as headers with r-- > permissions, once as .text with r-x permissions), causing a segfault, > and a nasty message printed to the host kernel's dmesg: > > "Uhuuh, elf segment at 0000000060000000 requested but the memory is > mapped already" > > By aligning the .text to a page boundary (as in the dynamically linked > version in dyn.lds.S), there is no such overlap, and the kernel runs > correctly. > > Signed-off-by: David Gow <davidgow@google.com> I can confirm that I am seeing this problem as well. (I know we run the same Linux distro; nevertheless, this is a real problem for some population of users.) Reviewed-by: Brendan Higgins <brendanhiggins@google.com>
On Tue, Mar 10, 2020 at 10:24 PM Brendan Higgins <brendanhiggins@google.com> wrote: > > On Thu, Mar 5, 2020 at 10:39 AM David Gow <davidgow@google.com> wrote: > > > > When statically linked, the .text section in UML kernels is not page > > aligned, causing it to share a page with the executable headers. As > > .text and the executable headers have different permissions, this causes > > the kernel to wish to map the same page twice (once as headers with r-- > > permissions, once as .text with r-x permissions), causing a segfault, > > and a nasty message printed to the host kernel's dmesg: > > > > "Uhuuh, elf segment at 0000000060000000 requested but the memory is > > mapped already" > > > > By aligning the .text to a page boundary (as in the dynamically linked > > version in dyn.lds.S), there is no such overlap, and the kernel runs > > correctly. > > > > Signed-off-by: David Gow <davidgow@google.com> > > I can confirm that I am seeing this problem as well. (I know we run > the same Linux distro; nevertheless, this is a real problem for some > population of users.) > > Reviewed-by: Brendan Higgins <brendanhiggins@google.com> Applied, thanks!
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S index 9f21443be2c9..3b6dab3d4501 100644 --- a/arch/um/kernel/uml.lds.S +++ b/arch/um/kernel/uml.lds.S @@ -19,10 +19,10 @@ SECTIONS __binary_start = START; . = START + SIZEOF_HEADERS; + . = ALIGN(PAGE_SIZE); _text = .; INIT_TEXT_SECTION(0) - . = ALIGN(PAGE_SIZE); .text : {
When statically linked, the .text section in UML kernels is not page aligned, causing it to share a page with the executable headers. As .text and the executable headers have different permissions, this causes the kernel to wish to map the same page twice (once as headers with r-- permissions, once as .text with r-x permissions), causing a segfault, and a nasty message printed to the host kernel's dmesg: "Uhuuh, elf segment at 0000000060000000 requested but the memory is mapped already" By aligning the .text to a page boundary (as in the dynamically linked version in dyn.lds.S), there is no such overlap, and the kernel runs correctly. Signed-off-by: David Gow <davidgow@google.com> --- I'm not 100% sure what triggered this -- possibly a change to the host kernel on my machine -- as I'm able to reproduce the issue as far back as in 4.4, but it seems to be reproducible easily on my machine with defconfig + CONFIG_STATIC_LINK=y. arch/um/kernel/uml.lds.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)