Commit c8a8dd1d authored by Rafael Ávila de Espíndola's avatar Rafael Ávila de Espíndola Committed by Greg Kroah-Hartman

x86/build: Mark per-CPU symbols as absolute explicitly for LLD

[ Upstream commit d071ae09 ]

Accessing per-CPU variables is done by finding the offset of the
variable in the per-CPU block and adding it to the address of the
respective CPU's block.

Section 3.10.8 of ld.bfd's documentation states:

  For expressions involving numbers, relative addresses and absolute
  addresses, ld follows these rules to evaluate terms:

  Other binary operations, that is, between two relative addresses
  not in the same section, or between a relative address and an
  absolute address, first convert any non-absolute term to an
  absolute address before applying the operator."

Note that LLVM's linker does not adhere to the GNU ld's implementation
and as such requires implicitly-absolute terms to be explicitly marked
as absolute in the linker script. If not, it fails currently with:

  ld.lld: error: ./arch/x86/kernel/ at least one side of the expression must be absolute
  ld.lld: error: ./arch/x86/kernel/ at least one side of the expression must be absolute
  Makefile:1040: recipe for target 'vmlinux' failed

This is not a functional change for ld.bfd which converts the term to an
absolute symbol anyways as specified above.

Based on a previous submission by Tri Vo <>.
Reported-by: Dmitry Golovin's avatarDmitry Golovin <>
Signed-off-by: Rafael Ávila de Espíndola's avatarRafael Ávila de Espíndola <>
[ Update commit message per Boris' and Michael's suggestions. ]
Signed-off-by: default avatarNick Desaulniers <>
[ Massage commit message more, fix typos. ]
Signed-off-by: default avatarBorislav Petkov <>
Tested-by: Dmitry Golovin's avatarDmitry Golovin <>
Cc: "H. Peter Anvin" <>
Cc: Andy Lutomirski <>
Cc: Brijesh Singh <>
Cc: Cao Jin <>
Cc: Ingo Molnar <>
Cc: Joerg Roedel <>
Cc: Masahiro Yamada <>
Cc: Masami Hiramatsu <>
Cc: Thomas Gleixner <>
Cc: Tri Vo <>
Cc: x86-ml <>
Link: default avatarSasha Levin <>
parent 38af5462
......@@ -401,7 +401,7 @@ SECTIONS
* Per-cpu symbols which need to be offset from __per_cpu_load
* for the boot processor.
#define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load
#define INIT_PER_CPU(x) init_per_cpu__##x = ABSOLUTE(x) + __per_cpu_load
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment