Tejun Heo | 405d967 | 2009-06-24 15:13:38 +0900 | [diff] [blame] | 1 | /* |
| 2 | * Common module linker script, always used when linking a module. |
| 3 | * Archs are free to supply their own linker scripts. ld will |
| 4 | * combine them automatically. |
| 5 | */ |
Ard Biesheuvel | 6ec9ba5 | 2022-10-27 17:59:06 +0200 | [diff] [blame] | 6 | #ifdef CONFIG_UNWIND_TABLES |
| 7 | #define DISCARD_EH_FRAME |
| 8 | #else |
| 9 | #define DISCARD_EH_FRAME *(.eh_frame) |
| 10 | #endif |
| 11 | |
Sami Tolvanen | 28aad1c | 2021-04-08 11:28:29 -0700 | [diff] [blame] | 12 | #ifdef CONFIG_CFI_CLANG |
| 13 | # include <asm/page.h> |
| 14 | # define ALIGN_CFI ALIGN(PAGE_SIZE) |
Ard Biesheuvel | 6ec9ba5 | 2022-10-27 17:59:06 +0200 | [diff] [blame] | 15 | # define SANITIZER_DISCARDS DISCARD_EH_FRAME |
Sami Tolvanen | 28aad1c | 2021-04-08 11:28:29 -0700 | [diff] [blame] | 16 | #else |
| 17 | # define ALIGN_CFI |
| 18 | # define SANITIZER_DISCARDS |
| 19 | #endif |
| 20 | |
Tejun Heo | 405d967 | 2009-06-24 15:13:38 +0900 | [diff] [blame] | 21 | SECTIONS { |
Josh Poimboeuf | e390f9a | 2017-03-01 12:04:44 -0600 | [diff] [blame] | 22 | /DISCARD/ : { |
| 23 | *(.discard) |
| 24 | *(.discard.*) |
Sami Tolvanen | 28aad1c | 2021-04-08 11:28:29 -0700 | [diff] [blame] | 25 | SANITIZER_DISCARDS |
Josh Poimboeuf | e390f9a | 2017-03-01 12:04:44 -0600 | [diff] [blame] | 26 | } |
Alessio Igor Bogani | f02e8a6 | 2011-04-14 14:59:39 +0200 | [diff] [blame] | 27 | |
Rabin Vincent | 5d8591b | 2015-02-06 15:09:57 +1030 | [diff] [blame] | 28 | __ksymtab 0 : { *(SORT(___ksymtab+*)) } |
| 29 | __ksymtab_gpl 0 : { *(SORT(___ksymtab_gpl+*)) } |
Rabin Vincent | 5d8591b | 2015-02-06 15:09:57 +1030 | [diff] [blame] | 30 | __kcrctab 0 : { *(SORT(___kcrctab+*)) } |
| 31 | __kcrctab_gpl 0 : { *(SORT(___kcrctab_gpl+*)) } |
Andrey Ryabinin | 9ddf825 | 2015-02-13 14:40:10 -0800 | [diff] [blame] | 32 | |
Reiner Huober | 4c5afb7 | 2021-07-06 15:02:52 +0200 | [diff] [blame] | 33 | .ctors 0 : ALIGN(8) { *(SORT(.ctors.*)) *(.ctors) } |
David Daney | 5bd933f | 2017-03-07 17:31:08 -0800 | [diff] [blame] | 34 | .init_array 0 : ALIGN(8) { *(SORT(.init_array.*)) *(.init_array) } |
David Daney | ab42632 | 2017-03-01 14:04:53 -0800 | [diff] [blame] | 35 | |
Helge Deller | 9774b96 | 2022-07-08 11:44:54 +0200 | [diff] [blame] | 36 | .altinstructions 0 : ALIGN(8) { KEEP(*(.altinstructions)) } |
| 37 | __bug_table 0 : ALIGN(8) { KEEP(*(__bug_table)) } |
David Daney | ab42632 | 2017-03-01 14:04:53 -0800 | [diff] [blame] | 38 | __jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) } |
Sami Tolvanen | dd27762 | 2020-12-11 10:46:22 -0800 | [diff] [blame] | 39 | |
| 40 | __patchable_function_entries : { *(__patchable_function_entries) } |
| 41 | |
Eric Biggers | 6da26b8 | 2023-01-06 05:07:18 +0000 | [diff] [blame] | 42 | #if IS_ENABLED(CONFIG_CRYPTO_FIPS140_MOD) |
Eric Biggers | 57be891 | 2023-01-06 05:07:15 +0000 | [diff] [blame] | 43 | /* |
| 44 | * The FIPS140 module incorporates copies of builtin code, which gets |
| 45 | * integrity checked at module load time, and registered in a way that |
| 46 | * ensures that the integrity checked versions supersede the builtin |
| 47 | * ones. These objects are compiled as builtin code, and so their init |
| 48 | * hooks will be exported from the binary in the same way as builtin |
| 49 | * initcalls are, i.e., annotated with a level that defines the order |
| 50 | * in which the hooks are expected to be invoked. |
| 51 | */ |
| 52 | #define INIT_CALLS_LEVEL(level) \ |
| 53 | KEEP(*(.initcall##level##.init*)) \ |
| 54 | KEEP(*(.initcall##level##s.init*)) |
| 55 | |
| 56 | .initcalls : { |
| 57 | *(.initcalls._start) |
| 58 | INIT_CALLS_LEVEL(0) |
| 59 | INIT_CALLS_LEVEL(1) |
| 60 | INIT_CALLS_LEVEL(2) |
| 61 | INIT_CALLS_LEVEL(3) |
| 62 | INIT_CALLS_LEVEL(4) |
| 63 | INIT_CALLS_LEVEL(5) |
| 64 | INIT_CALLS_LEVEL(rootfs) |
| 65 | INIT_CALLS_LEVEL(6) |
| 66 | INIT_CALLS_LEVEL(7) |
| 67 | *(.initcalls._end) |
| 68 | } |
| 69 | #endif |
| 70 | |
Eric Biggers | ae4ca7a | 2023-01-06 05:07:20 +0000 | [diff] [blame] | 71 | #if defined(CONFIG_LTO_CLANG) || IS_ENABLED(CONFIG_CRYPTO_FIPS140_MOD) |
Sami Tolvanen | dd27762 | 2020-12-11 10:46:22 -0800 | [diff] [blame] | 72 | /* |
| 73 | * With CONFIG_LTO_CLANG, LLD always enables -fdata-sections and |
| 74 | * -ffunction-sections, which increases the size of the final module. |
| 75 | * Merge the split sections in the final binary. |
| 76 | */ |
| 77 | .bss : { |
| 78 | *(.bss .bss.[0-9a-zA-Z_]*) |
| 79 | *(.bss..L*) |
| 80 | } |
| 81 | |
| 82 | .data : { |
| 83 | *(.data .data.[0-9a-zA-Z_]*) |
| 84 | *(.data..L*) |
| 85 | } |
| 86 | |
| 87 | .rodata : { |
Ard Biesheuvel | 5651d74 | 2021-03-23 10:54:38 +0100 | [diff] [blame] | 88 | *(.rodata.._start) |
Sami Tolvanen | dd27762 | 2020-12-11 10:46:22 -0800 | [diff] [blame] | 89 | *(.rodata .rodata.[0-9a-zA-Z_]*) |
| 90 | *(.rodata..L*) |
Ard Biesheuvel | 5651d74 | 2021-03-23 10:54:38 +0100 | [diff] [blame] | 91 | *(.rodata.._end) |
Sami Tolvanen | dd27762 | 2020-12-11 10:46:22 -0800 | [diff] [blame] | 92 | } |
| 93 | |
Sami Tolvanen | 28aad1c | 2021-04-08 11:28:29 -0700 | [diff] [blame] | 94 | /* |
| 95 | * With CONFIG_CFI_CLANG, we assume __cfi_check is at the beginning |
| 96 | * of the .text section, and is aligned to PAGE_SIZE. |
| 97 | */ |
| 98 | .text : ALIGN_CFI { |
Ard Biesheuvel | 5651d74 | 2021-03-23 10:54:38 +0100 | [diff] [blame] | 99 | *(.text.._start) |
Sami Tolvanen | 28aad1c | 2021-04-08 11:28:29 -0700 | [diff] [blame] | 100 | *(.text.__cfi_check) |
| 101 | *(.text .text.[0-9a-zA-Z_]* .text..L.cfi*) |
Ard Biesheuvel | 5651d74 | 2021-03-23 10:54:38 +0100 | [diff] [blame] | 102 | *(.text.._end) |
| 103 | *(.text.._fips140_unchecked) |
Sami Tolvanen | 28aad1c | 2021-04-08 11:28:29 -0700 | [diff] [blame] | 104 | } |
Sean Christopherson | 6a3193c | 2021-03-22 16:44:38 -0700 | [diff] [blame] | 105 | #endif |
Tejun Heo | 405d967 | 2009-06-24 15:13:38 +0900 | [diff] [blame] | 106 | } |
Masahiro Yamada | 596b047 | 2020-09-08 13:27:08 +0900 | [diff] [blame] | 107 | |
| 108 | /* bring in arch-specific sections */ |
| 109 | #include <asm/module.lds.h> |