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