History

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.

Alessio Igor Bogani committed 15 years ago

Commit f02e8a61 parent de4d8d53 files · +23 −12Browse files

Unified · Split

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