Commit | Line | Data |
---|---|---|
9c9b8b38 JF |
1 | #ifndef _LINUX_ELFNOTE_H |
2 | #define _LINUX_ELFNOTE_H | |
3 | /* | |
4 | * Helper macros to generate ELF Note structures, which are put into a | |
5 | * PT_NOTE segment of the final vmlinux image. These are useful for | |
6 | * including name-value pairs of metadata into the kernel binary (or | |
7 | * modules?) for use by external programs. | |
8 | * | |
9 | * Each note has three parts: a name, a type and a desc. The name is | |
10 | * intended to distinguish the note's originator, so it would be a | |
11 | * company, project, subsystem, etc; it must be in a suitable form for | |
12 | * use in a section name. The type is an integer which is used to tag | |
13 | * the data, and is considered to be within the "name" namespace (so | |
14 | * "FooCo"'s type 42 is distinct from "BarProj"'s type 42). The | |
15 | * "desc" field is the actual data. There are no constraints on the | |
16 | * desc field's contents, though typically they're fairly small. | |
17 | * | |
18 | * All notes from a given NAME are put into a section named | |
19 | * .note.NAME. When the kernel image is finally linked, all the notes | |
20 | * are packed into a single .notes section, which is mapped into the | |
21 | * PT_NOTE segment. Because notes for a given name are grouped into | |
22 | * the same section, they'll all be adjacent the output file. | |
23 | * | |
24 | * This file defines macros for both C and assembler use. Their | |
25 | * syntax is slightly different, but they're semantically similar. | |
26 | * | |
27 | * See the ELF specification for more detail about ELF notes. | |
28 | */ | |
29 | ||
30 | #ifdef __ASSEMBLER__ | |
31 | /* | |
32 | * Generate a structure with the same shape as Elf{32,64}_Nhdr (which | |
33 | * turn out to be the same size and shape), followed by the name and | |
34 | * desc data with appropriate padding. The 'desc' argument includes | |
35 | * the assembler pseudo op defining the type of the data: .asciz | |
36 | * "hello, world" | |
37 | */ | |
38 | .macro ELFNOTE name type desc:vararg | |
39 | .pushsection ".note.\name" | |
40 | .align 4 | |
41 | .long 2f - 1f /* namesz */ | |
42 | .long 4f - 3f /* descsz */ | |
43 | .long \type | |
44 | 1:.asciz "\name" | |
45 | 2:.align 4 | |
46 | 3:\desc | |
47 | 4:.align 4 | |
48 | .popsection | |
49 | .endm | |
50 | #else /* !__ASSEMBLER__ */ | |
51 | #include <linux/elf.h> | |
52 | /* | |
53 | * Use an anonymous structure which matches the shape of | |
54 | * Elf{32,64}_Nhdr, but includes the name and desc data. The size and | |
55 | * type of name and desc depend on the macro arguments. "name" must | |
56 | * be a literal string, and "desc" must be passed by value. You may | |
57 | * only define one note per line, since __LINE__ is used to generate | |
58 | * unique symbols. | |
59 | */ | |
60 | #define _ELFNOTE_PASTE(a,b) a##b | |
61 | #define _ELFNOTE(size, name, unique, type, desc) \ | |
62 | static const struct { \ | |
63 | struct elf##size##_note _nhdr; \ | |
64 | unsigned char _name[sizeof(name)] \ | |
65 | __attribute__((aligned(sizeof(Elf##size##_Word)))); \ | |
66 | typeof(desc) _desc \ | |
67 | __attribute__((aligned(sizeof(Elf##size##_Word)))); \ | |
68 | } _ELFNOTE_PASTE(_note_, unique) \ | |
69 | __attribute_used__ \ | |
70 | __attribute__((section(".note." name), \ | |
71 | aligned(sizeof(Elf##size##_Word)), \ | |
72 | unused)) = { \ | |
73 | { \ | |
74 | sizeof(name), \ | |
75 | sizeof(desc), \ | |
76 | type, \ | |
77 | }, \ | |
78 | name, \ | |
79 | desc \ | |
80 | } | |
81 | #define ELFNOTE(size, name, type, desc) \ | |
82 | _ELFNOTE(size, name, __LINE__, type, desc) | |
83 | ||
84 | #define ELFNOTE32(name, type, desc) ELFNOTE(32, name, type, desc) | |
85 | #define ELFNOTE64(name, type, desc) ELFNOTE(64, name, type, desc) | |
86 | #endif /* __ASSEMBLER__ */ | |
87 | ||
88 | #endif /* _LINUX_ELFNOTE_H */ |