xref: /linux-6.15/include/linux/export.h (revision d7476f24)
1bf49d9ddSMasahiro Yamada /* SPDX-License-Identifier: GPL-2.0-only */
2f5016932SPaul Gortmaker #ifndef _LINUX_EXPORT_H
3f5016932SPaul Gortmaker #define _LINUX_EXPORT_H
4b67067f1SNicholas Piggin 
5ddb5cdbaSMasahiro Yamada #include <linux/compiler.h>
6ddb5cdbaSMasahiro Yamada #include <linux/linkage.h>
7d143b9dbSGreg Kroah-Hartman #include <linux/stringify.h>
8d143b9dbSGreg Kroah-Hartman 
9f5016932SPaul Gortmaker /*
107b453719SMasahiro Yamada  * This comment block is used by fixdep. Please do not remove.
117b453719SMasahiro Yamada  *
127b453719SMasahiro Yamada  * When CONFIG_MODVERSIONS is changed from n to y, all source files having
137b453719SMasahiro Yamada  * EXPORT_SYMBOL variants must be re-compiled because genksyms is run as a
147b453719SMasahiro Yamada  * side effect of the *.o build rule.
157b453719SMasahiro Yamada  */
167b453719SMasahiro Yamada 
17ddb5cdbaSMasahiro Yamada #ifdef CONFIG_64BIT
18ddb5cdbaSMasahiro Yamada #define __EXPORT_SYMBOL_REF(sym)			\
19ddb5cdbaSMasahiro Yamada 	.balign 8				ASM_NL	\
20ddb5cdbaSMasahiro Yamada 	.quad sym
217290d580SArd Biesheuvel #else
22ddb5cdbaSMasahiro Yamada #define __EXPORT_SYMBOL_REF(sym)			\
23ddb5cdbaSMasahiro Yamada 	.balign 4				ASM_NL	\
24ddb5cdbaSMasahiro Yamada 	.long sym
257290d580SArd Biesheuvel #endif
267290d580SArd Biesheuvel 
275e9e95ccSMasahiro Yamada #define ___EXPORT_SYMBOL(sym, license, ns)		\
28ddb5cdbaSMasahiro Yamada 	.section ".export_symbol","a"		ASM_NL	\
29ddb5cdbaSMasahiro Yamada 	__export_symbol_##sym:			ASM_NL	\
30ddb5cdbaSMasahiro Yamada 		.asciz license			ASM_NL	\
31ddb5cdbaSMasahiro Yamada 		.asciz ns			ASM_NL	\
32ddb5cdbaSMasahiro Yamada 		__EXPORT_SYMBOL_REF(sym)	ASM_NL	\
33ddb5cdbaSMasahiro Yamada 	.previous
34ddb5cdbaSMasahiro Yamada 
35481461f5SMasahiro Yamada #if defined(__DISABLE_EXPORTS)
36f922c4abSArd Biesheuvel 
37f922c4abSArd Biesheuvel /*
38f922c4abSArd Biesheuvel  * Allow symbol exports to be disabled completely so that C code may
39f922c4abSArd Biesheuvel  * be reused in other execution contexts such as the UEFI stub or the
40f922c4abSArd Biesheuvel  * decompressor.
41f922c4abSArd Biesheuvel  */
428ed7e33aSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns)
43f922c4abSArd Biesheuvel 
445e9e95ccSMasahiro Yamada #elif defined(__GENKSYMS__)
45f2355416SNicolas Pitre 
468ed7e33aSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns)	__GENKSYMS_EXPORT_SYMBOL(sym)
47f2355416SNicolas Pitre 
485e9e95ccSMasahiro Yamada #elif defined(__ASSEMBLY__)
49ddb5cdbaSMasahiro Yamada 
505e9e95ccSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns) \
515e9e95ccSMasahiro Yamada 	___EXPORT_SYMBOL(sym, license, ns)
52ddb5cdbaSMasahiro Yamada 
53ddb5cdbaSMasahiro Yamada #else
54ddb5cdbaSMasahiro Yamada 
55*d7476f24SSami Tolvanen #ifdef CONFIG_GENDWARFKSYMS
56*d7476f24SSami Tolvanen /*
57*d7476f24SSami Tolvanen  * With CONFIG_GENDWARFKSYMS, ensure the compiler emits debugging
58*d7476f24SSami Tolvanen  * information for all exported symbols, including those defined in
59*d7476f24SSami Tolvanen  * different TUs, by adding a __gendwarfksyms_ptr_<symbol> pointer
60*d7476f24SSami Tolvanen  * that's discarded during the final link.
61*d7476f24SSami Tolvanen  */
62*d7476f24SSami Tolvanen #define __GENDWARFKSYMS_EXPORT(sym)				\
63*d7476f24SSami Tolvanen 	static typeof(sym) *__gendwarfksyms_ptr_##sym __used	\
64*d7476f24SSami Tolvanen 		__section(".discard.gendwarfksyms") = &sym;
65*d7476f24SSami Tolvanen #else
66*d7476f24SSami Tolvanen #define __GENDWARFKSYMS_EXPORT(sym)
67*d7476f24SSami Tolvanen #endif
68*d7476f24SSami Tolvanen 
695e9e95ccSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns)			\
705e9e95ccSMasahiro Yamada 	extern typeof(sym) sym;					\
715e9e95ccSMasahiro Yamada 	__ADDRESSABLE(sym)					\
72*d7476f24SSami Tolvanen 	__GENDWARFKSYMS_EXPORT(sym)				\
735e9e95ccSMasahiro Yamada 	asm(__stringify(___EXPORT_SYMBOL(sym, license, ns)))
74f5016932SPaul Gortmaker 
75481461f5SMasahiro Yamada #endif
76f5016932SPaul Gortmaker 
778e2adc6aSMatthias Maennich #ifdef DEFAULT_SYMBOL_NAMESPACE
78ceb8bf2cSMasahiro Yamada #define _EXPORT_SYMBOL(sym, license)	__EXPORT_SYMBOL(sym, license, DEFAULT_SYMBOL_NAMESPACE)
79c3a6cf19SMasahiro Yamada #else
808ed7e33aSMasahiro Yamada #define _EXPORT_SYMBOL(sym, license)	__EXPORT_SYMBOL(sym, license, "")
818e2adc6aSMatthias Maennich #endif
828e2adc6aSMatthias Maennich 
83c3a6cf19SMasahiro Yamada #define EXPORT_SYMBOL(sym)		_EXPORT_SYMBOL(sym, "")
84ddb5cdbaSMasahiro Yamada #define EXPORT_SYMBOL_GPL(sym)		_EXPORT_SYMBOL(sym, "GPL")
85cdd30ebbSPeter Zijlstra #define EXPORT_SYMBOL_NS(sym, ns)	__EXPORT_SYMBOL(sym, "", ns)
86cdd30ebbSPeter Zijlstra #define EXPORT_SYMBOL_NS_GPL(sym, ns)	__EXPORT_SYMBOL(sym, "GPL", ns)
87f5016932SPaul Gortmaker 
88f5016932SPaul Gortmaker #endif /* _LINUX_EXPORT_H */
89