• T
    linker script: use separate simpler definition for PERCPU() · 3ac6cffe
    Tejun Heo 提交于
    Impact: fix linker screwup on x86_32
    
    Recent x86_64 zerobased patches introduced PERCPU_VADDR() to put
    .data.percpu to a predefined address and re-defined PERCPU() in terms
    of it.  The new macro defined one extra symbol, __per_cpu_load, for
    LMA of the section so that the init data could be accessed.  This new
    symbol introduced the following problems to x86_32.
    
    1. If __per_cpu_load is defined outside of .data.percpu as an absolute
       symbol, relocation generation for relocatable kernel fails due to
       absolute relocation.
    
    2. If __per_cpu_load is put inside .data.percpu with absolute address
       assignment to work around #1, linker gets confused and under
       certain configurations ends up relocating the symbol against
       .data.percpu such that the load address gets added on top of
       already set load address.
    
    As x86_32 doesn't use predefined address for .data.percpu, there's no
    need for it to care about the possibility of __per_cpu_load being
    different from __per_cpu_start.
    
    This patch defines PERCPU() separately so that __per_cpu_load is
    defined inside .data.percpu so that everything is ordinary
    linking-wise.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    3ac6cffe
vmlinux.lds.h 15.4 KB