]> Git Repo - linux.git/commitdiff
runtime constants: deal with old decrepit linkers
authorLinus Torvalds <[email protected]>
Sat, 3 Aug 2024 01:12:06 +0000 (18:12 -0700)
committerLinus Torvalds <[email protected]>
Sat, 3 Aug 2024 15:38:45 +0000 (08:38 -0700)
The runtime constants linker script depended on documented linker
behavior [1]:

 "If an output section’s name is the same as the input section’s name
  and is representable as a C identifier, then the linker will
  automatically PROVIDE two symbols: __start_SECNAME and __stop_SECNAME,
  where SECNAME is the name of the section. These indicate the start
  address and end address of the output section respectively"

to just automatically define the symbol names for the bounds of the
runtime constant arrays.

It turns out that this isn't actually something we can rely on, with old
linkers not generating these automatic symbols.  It looks to have been
introduced in binutils-2.29 back in 2017, and we still support building
with versions all the way back to binutils-2.25 (from 2015).

And yes, Oleg actually seems to be using such ancient versions of
binutils.

So instead of depending on the implicit symbols from "section names
match and are representable C identifiers", just do this all manually.
It's not like it causes us any extra pain, we already have to do that
for all the other sections that we use that often have special
characters in them.

Reported-and-tested-by: Oleg Nesterov <[email protected]>
Link: https://sourceware.org/binutils/docs/ld/Input-Section-Example.html
Link: https://lore.kernel.org/all/[email protected]/
Signed-off-by: Linus Torvalds <[email protected]>
include/asm-generic/vmlinux.lds.h

index ad6afc5c49183a8043536fe7129901d3fa9c5717..1ae44793132a8d9a6349aff7dd51299f50cf820e 100644 (file)
 #define CON_INITCALL                                                   \
        BOUNDED_SECTION_POST_LABEL(.con_initcall.init, __con_initcall, _start, _end)
 
-#define RUNTIME_NAME(t,x) runtime_##t##_##x
+#define NAMED_SECTION(name) \
+       . = ALIGN(8); \
+       name : AT(ADDR(name) - LOAD_OFFSET) \
+       { BOUNDED_SECTION_PRE_LABEL(name, name, __start_, __stop_) }
 
-#define RUNTIME_CONST(t,x)                                             \
-       . = ALIGN(8);                                                   \
-       RUNTIME_NAME(t,x) : AT(ADDR(RUNTIME_NAME(t,x)) - LOAD_OFFSET) { \
-               *(RUNTIME_NAME(t,x));                                   \
-       }
+#define RUNTIME_CONST(t,x) NAMED_SECTION(runtime_##t##_##x)
 
 /* Alignment must be consistent with (kunit_suite *) in include/kunit/test.h */
 #define KUNIT_TABLE()                                                  \
This page took 0.056747 seconds and 4 git commands to generate.