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