xref: /linux-6.15/include/linux/elfnote.h (revision 3ff6eecc)
19c9b8b38SJeremy Fitzhardinge #ifndef _LINUX_ELFNOTE_H
29c9b8b38SJeremy Fitzhardinge #define _LINUX_ELFNOTE_H
39c9b8b38SJeremy Fitzhardinge /*
49c9b8b38SJeremy Fitzhardinge  * Helper macros to generate ELF Note structures, which are put into a
59c9b8b38SJeremy Fitzhardinge  * PT_NOTE segment of the final vmlinux image.  These are useful for
69c9b8b38SJeremy Fitzhardinge  * including name-value pairs of metadata into the kernel binary (or
79c9b8b38SJeremy Fitzhardinge  * modules?) for use by external programs.
89c9b8b38SJeremy Fitzhardinge  *
99c9b8b38SJeremy Fitzhardinge  * Each note has three parts: a name, a type and a desc.  The name is
109c9b8b38SJeremy Fitzhardinge  * intended to distinguish the note's originator, so it would be a
119c9b8b38SJeremy Fitzhardinge  * company, project, subsystem, etc; it must be in a suitable form for
129c9b8b38SJeremy Fitzhardinge  * use in a section name.  The type is an integer which is used to tag
139c9b8b38SJeremy Fitzhardinge  * the data, and is considered to be within the "name" namespace (so
149c9b8b38SJeremy Fitzhardinge  * "FooCo"'s type 42 is distinct from "BarProj"'s type 42).  The
159c9b8b38SJeremy Fitzhardinge  * "desc" field is the actual data.  There are no constraints on the
169c9b8b38SJeremy Fitzhardinge  * desc field's contents, though typically they're fairly small.
179c9b8b38SJeremy Fitzhardinge  *
189c9b8b38SJeremy Fitzhardinge  * All notes from a given NAME are put into a section named
199c9b8b38SJeremy Fitzhardinge  * .note.NAME.  When the kernel image is finally linked, all the notes
209c9b8b38SJeremy Fitzhardinge  * are packed into a single .notes section, which is mapped into the
219c9b8b38SJeremy Fitzhardinge  * PT_NOTE segment.  Because notes for a given name are grouped into
229c9b8b38SJeremy Fitzhardinge  * the same section, they'll all be adjacent the output file.
239c9b8b38SJeremy Fitzhardinge  *
249c9b8b38SJeremy Fitzhardinge  * This file defines macros for both C and assembler use.  Their
259c9b8b38SJeremy Fitzhardinge  * syntax is slightly different, but they're semantically similar.
269c9b8b38SJeremy Fitzhardinge  *
279c9b8b38SJeremy Fitzhardinge  * See the ELF specification for more detail about ELF notes.
289c9b8b38SJeremy Fitzhardinge  */
299c9b8b38SJeremy Fitzhardinge 
309c9b8b38SJeremy Fitzhardinge #ifdef __ASSEMBLER__
319c9b8b38SJeremy Fitzhardinge /*
329c9b8b38SJeremy Fitzhardinge  * Generate a structure with the same shape as Elf{32,64}_Nhdr (which
339c9b8b38SJeremy Fitzhardinge  * turn out to be the same size and shape), followed by the name and
345091e746SIan Campbell  * desc data with appropriate padding.  The 'desctype' argument is the
355091e746SIan Campbell  * assembler pseudo op defining the type of the data e.g. .asciz while
365091e746SIan Campbell  * 'descdata' is the data itself e.g.  "hello, world".
375091e746SIan Campbell  *
385091e746SIan Campbell  * e.g. ELFNOTE(XYZCo, 42, .asciz, "forty-two")
395091e746SIan Campbell  *      ELFNOTE(XYZCo, 12, .long, 0xdeadbeef)
409c9b8b38SJeremy Fitzhardinge  */
41810bab44SJeremy Fitzhardinge #define ELFNOTE_START(name, type, flags)	\
42810bab44SJeremy Fitzhardinge .pushsection .note.name, flags,@note	;	\
43810bab44SJeremy Fitzhardinge   .balign 4				;	\
445091e746SIan Campbell   .long 2f - 1f		/* namesz */	;	\
45810bab44SJeremy Fitzhardinge   .long 4484f - 3f	/* descsz */	;	\
465091e746SIan Campbell   .long type				;	\
4703df4f6eSJeremy Fitzhardinge 1:.asciz #name				;	\
48810bab44SJeremy Fitzhardinge 2:.balign 4				;	\
49810bab44SJeremy Fitzhardinge 3:
50810bab44SJeremy Fitzhardinge 
51810bab44SJeremy Fitzhardinge #define ELFNOTE_END				\
52810bab44SJeremy Fitzhardinge 4484:.balign 4				;	\
535091e746SIan Campbell .popsection				;
54810bab44SJeremy Fitzhardinge 
55810bab44SJeremy Fitzhardinge #define ELFNOTE(name, type, desc)		\
56810bab44SJeremy Fitzhardinge 	ELFNOTE_START(name, type, "")		\
57810bab44SJeremy Fitzhardinge 		desc			;	\
58810bab44SJeremy Fitzhardinge 	ELFNOTE_END
59810bab44SJeremy Fitzhardinge 
609c9b8b38SJeremy Fitzhardinge #else	/* !__ASSEMBLER__ */
619c9b8b38SJeremy Fitzhardinge #include <linux/elf.h>
629c9b8b38SJeremy Fitzhardinge /*
639c9b8b38SJeremy Fitzhardinge  * Use an anonymous structure which matches the shape of
649c9b8b38SJeremy Fitzhardinge  * Elf{32,64}_Nhdr, but includes the name and desc data.  The size and
659c9b8b38SJeremy Fitzhardinge  * type of name and desc depend on the macro arguments.  "name" must
669c9b8b38SJeremy Fitzhardinge  * be a literal string, and "desc" must be passed by value.  You may
679c9b8b38SJeremy Fitzhardinge  * only define one note per line, since __LINE__ is used to generate
689c9b8b38SJeremy Fitzhardinge  * unique symbols.
699c9b8b38SJeremy Fitzhardinge  */
709c9b8b38SJeremy Fitzhardinge #define _ELFNOTE_PASTE(a,b)	a##b
719c9b8b38SJeremy Fitzhardinge #define _ELFNOTE(size, name, unique, type, desc)			\
729c9b8b38SJeremy Fitzhardinge 	static const struct {						\
739c9b8b38SJeremy Fitzhardinge 		struct elf##size##_note _nhdr;				\
749c9b8b38SJeremy Fitzhardinge 		unsigned char _name[sizeof(name)]			\
759c9b8b38SJeremy Fitzhardinge 		__attribute__((aligned(sizeof(Elf##size##_Word))));	\
769c9b8b38SJeremy Fitzhardinge 		typeof(desc) _desc					\
779c9b8b38SJeremy Fitzhardinge 			     __attribute__((aligned(sizeof(Elf##size##_Word)))); \
789c9b8b38SJeremy Fitzhardinge 	} _ELFNOTE_PASTE(_note_, unique)				\
79*3ff6eeccSAdrian Bunk 		__used							\
809c9b8b38SJeremy Fitzhardinge 		__attribute__((section(".note." name),			\
819c9b8b38SJeremy Fitzhardinge 			       aligned(sizeof(Elf##size##_Word)),	\
829c9b8b38SJeremy Fitzhardinge 			       unused)) = {				\
839c9b8b38SJeremy Fitzhardinge 		{							\
849c9b8b38SJeremy Fitzhardinge 			sizeof(name),					\
859c9b8b38SJeremy Fitzhardinge 			sizeof(desc),					\
869c9b8b38SJeremy Fitzhardinge 			type,						\
879c9b8b38SJeremy Fitzhardinge 		},							\
889c9b8b38SJeremy Fitzhardinge 		name,							\
899c9b8b38SJeremy Fitzhardinge 		desc							\
909c9b8b38SJeremy Fitzhardinge 	}
919c9b8b38SJeremy Fitzhardinge #define ELFNOTE(size, name, type, desc)		\
929c9b8b38SJeremy Fitzhardinge 	_ELFNOTE(size, name, __LINE__, type, desc)
939c9b8b38SJeremy Fitzhardinge 
949c9b8b38SJeremy Fitzhardinge #define ELFNOTE32(name, type, desc) ELFNOTE(32, name, type, desc)
959c9b8b38SJeremy Fitzhardinge #define ELFNOTE64(name, type, desc) ELFNOTE(64, name, type, desc)
969c9b8b38SJeremy Fitzhardinge #endif	/* __ASSEMBLER__ */
979c9b8b38SJeremy Fitzhardinge 
989c9b8b38SJeremy Fitzhardinge #endif /* _LINUX_ELFNOTE_H */
99