Commit f02e8a6596b7dc9b2171f7ff5654039ef0950cdc
Committed by
Rusty Russell
1 parent
de4d8d5346
Exists in
master
and in
7 other branches
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 | } |