Commit f02e8a6596b7dc9b2171f7ff5654039ef0950cdc

Authored by Alessio Igor Bogani
Committed by Rusty Russell
1 parent de4d8d5346

module: Sort exported symbols

This patch places every exported symbol in its own section
(i.e. "___ksymtab+printk").  Thus the linker will use its SORT() directive
to sort and finally merge all symbol in the right and final section
(i.e. "__ksymtab").

The symbol prefixed archs use an underscore as prefix for symbols.
To avoid collision we use a different character to create the temporary
section names.

This work was supported by a hardware donation from the CE Linux Forum.

Signed-off-by: Alessio Igor Bogani <abogani@kernel.org>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (folded in '+' fixup)
Tested-by: Dirk Behme <dirk.behme@googlemail.com>

Showing 3 changed files with 23 additions and 12 deletions Side-by-side Diff

include/asm-generic/vmlinux.lds.h
... ... @@ -274,70 +274,70 @@
274 274 /* Kernel symbol table: Normal symbols */ \
275 275 __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
276 276 VMLINUX_SYMBOL(__start___ksymtab) = .; \
277   - *(__ksymtab) \
  277 + *(SORT(___ksymtab+*)) \
278 278 VMLINUX_SYMBOL(__stop___ksymtab) = .; \
279 279 } \
280 280 \
281 281 /* Kernel symbol table: GPL-only symbols */ \
282 282 __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
283 283 VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \
284   - *(__ksymtab_gpl) \
  284 + *(SORT(___ksymtab_gpl+*)) \
285 285 VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
286 286 } \
287 287 \
288 288 /* Kernel symbol table: Normal unused symbols */ \
289 289 __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \
290 290 VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \
291   - *(__ksymtab_unused) \
  291 + *(SORT(___ksymtab_unused+*)) \
292 292 VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \
293 293 } \
294 294 \
295 295 /* Kernel symbol table: GPL-only unused symbols */ \
296 296 __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
297 297 VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \
298   - *(__ksymtab_unused_gpl) \
  298 + *(SORT(___ksymtab_unused_gpl+*)) \
299 299 VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \
300 300 } \
301 301 \
302 302 /* Kernel symbol table: GPL-future-only symbols */ \
303 303 __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
304 304 VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \
305   - *(__ksymtab_gpl_future) \
  305 + *(SORT(___ksymtab_gpl_future+*)) \
306 306 VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \
307 307 } \
308 308 \
309 309 /* Kernel symbol table: Normal symbols */ \
310 310 __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \
311 311 VMLINUX_SYMBOL(__start___kcrctab) = .; \
312   - *(__kcrctab) \
  312 + *(SORT(___kcrctab+*)) \
313 313 VMLINUX_SYMBOL(__stop___kcrctab) = .; \
314 314 } \
315 315 \
316 316 /* Kernel symbol table: GPL-only symbols */ \
317 317 __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \
318 318 VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \
319   - *(__kcrctab_gpl) \
  319 + *(SORT(___kcrctab_gpl+*)) \
320 320 VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \
321 321 } \
322 322 \
323 323 /* Kernel symbol table: Normal unused symbols */ \
324 324 __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \
325 325 VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \
326   - *(__kcrctab_unused) \
  326 + *(SORT(___kcrctab_unused+*)) \
327 327 VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \
328 328 } \
329 329 \
330 330 /* Kernel symbol table: GPL-only unused symbols */ \
331 331 __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \
332 332 VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \
333   - *(__kcrctab_unused_gpl) \
  333 + *(SORT(___kcrctab_unused_gpl+*)) \
334 334 VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \
335 335 } \
336 336 \
337 337 /* Kernel symbol table: GPL-future-only symbols */ \
338 338 __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \
339 339 VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \
340   - *(__kcrctab_gpl_future) \
  340 + *(SORT(___kcrctab_gpl_future+*)) \
341 341 VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \
342 342 } \
343 343 \
include/linux/module.h
... ... @@ -224,7 +224,7 @@
224 224 extern void *__crc_##sym __attribute__((weak)); \
225 225 static const unsigned long __kcrctab_##sym \
226 226 __used \
227   - __attribute__((section("__kcrctab" sec), unused)) \
  227 + __attribute__((section("___kcrctab" sec "+" #sym), unused)) \
228 228 = (unsigned long) &__crc_##sym;
229 229 #else
230 230 #define __CRC_SYMBOL(sym, sec)
... ... @@ -239,7 +239,7 @@
239 239 = MODULE_SYMBOL_PREFIX #sym; \
240 240 static const struct kernel_symbol __ksymtab_##sym \
241 241 __used \
242   - __attribute__((section("__ksymtab" sec), unused)) \
  242 + __attribute__((section("___ksymtab" sec "+" #sym), unused)) \
243 243 = { (unsigned long)&sym, __kstrtab_##sym }
244 244  
245 245 #define EXPORT_SYMBOL(sym) \
scripts/module-common.lds
... ... @@ -5,5 +5,16 @@
5 5 */
6 6 SECTIONS {
7 7 /DISCARD/ : { *(.discard) }
  8 +
  9 + __ksymtab : { *(SORT(___ksymtab+*)) }
  10 + __ksymtab_gpl : { *(SORT(___ksymtab_gpl+*)) }
  11 + __ksymtab_unused : { *(SORT(___ksymtab_unused+*)) }
  12 + __ksymtab_unused_gpl : { *(SORT(___ksymtab_unused_gpl+*)) }
  13 + __ksymtab_gpl_future : { *(SORT(___ksymtab_gpl_future+*)) }
  14 + __kcrctab : { *(SORT(___kcrctab+*)) }
  15 + __kcrctab_gpl : { *(SORT(___kcrctab_gpl+*)) }
  16 + __kcrctab_unused : { *(SORT(___kcrctab_unused+*)) }
  17 + __kcrctab_unused_gpl : { *(SORT(___kcrctab_unused_gpl+*)) }
  18 + __kcrctab_gpl_future : { *(SORT(___kcrctab_gpl_future+*)) }
8 19 }