PIE: Support embedding position independent executables
[firefly-linux-kernel-4.4.55.git] / include / asm-generic / pie.lds.h
1 /*
2  * Helper macros to support writing architecture specific
3  * pie linker scripts.
4  *
5  * A minimal linker scripts has following content:
6  * [This is a sample, architectures may have special requiriements]
7  *
8  * OUTPUT_FORMAT(...)
9  * OUTPUT_ARCH(...)
10  * SECTIONS
11  * {
12  *      . = 0x0;
13  *
14  *      PIE_COMMON_START
15  *      .text {
16  *              PIE_TEXT_TEXT
17  *      }
18  *      PIE_COMMON_END
19  *
20  *      PIE_OVERLAY_START
21  *      OVERLAY : NOCROSSREFS {
22  *              PIE_OVERLAY_SECTION(am33xx)
23  *              PIE_OVERLAY_SECTION(am347x)
24  *              [...]
25  *      }
26  *      PIE_OVERLAY_END
27  *
28  *      PIE_DISCARDS            // must be the last
29  * }
30  */
31
32 #include <asm-generic/vmlinux.lds.h>
33
34 #define PIE_COMMON_START                                                \
35         __pie_common_start : {                                          \
36                 VMLINUX_SYMBOL(__pie_common_start) = .;                 \
37         }
38
39 #define PIE_COMMON_END                                                  \
40         __pie_common_end : {                                            \
41                 VMLINUX_SYMBOL(__pie_common_end) = .;                   \
42         }
43
44 #define PIE_OVERLAY_START                                               \
45         __pie_overlay_start : {                                         \
46                 VMLINUX_SYMBOL(__pie_overlay_start) = .;                \
47         }
48
49 #define PIE_OVERLAY_END                                                 \
50         __pie_overlay_end : {                                           \
51                 VMLINUX_SYMBOL(__pie_overlay_end) = .;                  \
52         }
53
54 #define PIE_TEXT_TEXT                                                   \
55         KEEP(*(.pie.text))
56
57 #define PIE_OVERLAY_SECTION(name)                                       \
58         .pie.##name {                                                   \
59                 KEEP(*(.pie.##name##.*))                                \
60                 VMLINUX_SYMBOL(__pie_##name##_start) =                  \
61                                 LOADADDR(.pie.##name##);                \
62                 VMLINUX_SYMBOL(__pie_##name##_end) =                    \
63                                 LOADADDR(.pie.##name##) +               \
64                                 SIZEOF(.pie.##name##);                  \
65         }
66
67 #define PIE_DISCARDS                                                    \
68         /DISCARD/ : {                                                   \
69         *(.dynsym)                                                      \
70         *(.dynstr*)                                                     \
71         *(.dynamic*)                                                    \
72         *(.plt*)                                                        \
73         *(.interp*)                                                     \
74         *(.gnu*)                                                        \
75         *(.hash)                                                        \
76         *(.comment)                                                     \
77         *(.bss*)                                                        \
78         *(.data)                                                        \
79         *(.discard)                                                     \
80         *(.discard.*)                                                   \
81         }
82