From: Rusty Russell My previous warning fix broke lguest if your text size wasn't correct to make the __start_paravirtprobe aligned correctly. Put the separate paravirtprobe section back, but inside the init section so it gets discarded. It also fixes the remaining warnings, except one. The code in modpost.c which needs to be taught that it's legal to link from .paravirtprobe to .init.text is horrible, and I'm pretty sure I'd just make it worse. Signed-off-by: Rusty Russell Signed-off-by: Andrew Morton --- arch/i386/kernel/vmlinux.lds.S | 12 ++++++------ arch/i386/lguest/core.c | 2 +- arch/i386/lguest/lg.h | 2 +- arch/i386/lguest/lguest.c | 5 +++-- arch/i386/lguest/page_tables.c | 2 +- 5 files changed, 12 insertions(+), 11 deletions(-) diff -puN arch/i386/kernel/vmlinux.lds.S~lguest-clean-up-some-references-inittext-warnings-2 arch/i386/kernel/vmlinux.lds.S --- a/arch/i386/kernel/vmlinux.lds.S~lguest-clean-up-some-references-inittext-warnings-2 +++ a/arch/i386/kernel/vmlinux.lds.S @@ -145,12 +145,7 @@ SECTIONS *(.init.text) _einittext = .; } - .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { - *(.init.data) - __start_paravirtprobe = .; - *(.paravirtprobe) - __stop_paravirtprobe = .; - } + .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) } . = ALIGN(16); .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { __setup_start = .; @@ -178,6 +173,11 @@ SECTIONS *(.altinstr_replacement) } . = ALIGN(4); + .paravirtprobe : AT(ADDR(.paravirtprobe) - LOAD_OFFSET) { + __start_paravirtprobe = .; + *(.paravirtprobe) + __stop_paravirtprobe = .; + } .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { __start_parainstructions = .; *(.parainstructions) diff -puN arch/i386/lguest/core.c~lguest-clean-up-some-references-inittext-warnings-2 arch/i386/lguest/core.c --- a/arch/i386/lguest/core.c~lguest-clean-up-some-references-inittext-warnings-2 +++ a/arch/i386/lguest/core.c @@ -112,7 +112,7 @@ free_some_pages: return err; } -static __exit void unmap_hypervisor(void) +static void unmap_hypervisor(void) { unsigned int i; diff -puN arch/i386/lguest/lg.h~lguest-clean-up-some-references-inittext-warnings-2 arch/i386/lguest/lg.h --- a/arch/i386/lguest/lg.h~lguest-clean-up-some-references-inittext-warnings-2 +++ a/arch/i386/lguest/lg.h @@ -38,7 +38,7 @@ struct lguest_regs u32 ss; }; -__exit void free_pagetables(void); +void free_pagetables(void); __init int init_pagetables(struct page **hype_page, int pages); /* Full 4G segment descriptors, suitable for CS and DS. */ diff -puN arch/i386/lguest/lguest.c~lguest-clean-up-some-references-inittext-warnings-2 arch/i386/lguest/lguest.c --- a/arch/i386/lguest/lguest.c~lguest-clean-up-some-references-inittext-warnings-2 +++ a/arch/i386/lguest/lguest.c @@ -550,7 +550,7 @@ static __attribute_used__ __init void lg start_kernel(); } -asm(".section .init.text\n" +asm(".pushsection .init.text,\"ax\",@progbits\n" "lguest_maybe_init:\n" " cmpl $"__stringify(LGUEST_MAGIC_EBP)", %ebp\n" " jne 1f\n" @@ -558,6 +558,7 @@ asm(".section .init.text\n" " jne 1f\n" " cmpl $"__stringify(LGUEST_MAGIC_ESI)", %esi\n" " je lguest_init\n" - "1: ret"); + "1: ret\n" + ".popsection"); extern void asmlinkage lguest_maybe_init(void); paravirt_probe(lguest_maybe_init); diff -puN arch/i386/lguest/page_tables.c~lguest-clean-up-some-references-inittext-warnings-2 arch/i386/lguest/page_tables.c --- a/arch/i386/lguest/page_tables.c~lguest-clean-up-some-references-inittext-warnings-2 +++ a/arch/i386/lguest/page_tables.c @@ -377,7 +377,7 @@ __init int init_pagetables(struct page * return 0; } -__exit void free_pagetables(void) +void free_pagetables(void) { free_hypervisor_pte_pages(); } _