xref: /linux/scripts/gendwarfksyms/examples/symbolptr.c (revision ba6ec09911b805778a2fed6d626bfe77b011a717)
1*fa624569SSami Tolvanen // SPDX-License-Identifier: GPL-2.0
2*fa624569SSami Tolvanen /*
3*fa624569SSami Tolvanen  * Copyright (C) 2024 Google LLC
4*fa624569SSami Tolvanen  *
5*fa624569SSami Tolvanen  * Example for symbol pointers. When compiled with Clang, gendwarfkyms
6*fa624569SSami Tolvanen  * uses a symbol pointer for `f`.
7*fa624569SSami Tolvanen  *
8*fa624569SSami Tolvanen  * $ clang -g -c examples/symbolptr.c -o examples/symbolptr.o
9*fa624569SSami Tolvanen  * $ echo -e "f\ng\np" | ./gendwarfksyms -d examples/symbolptr.o
10*fa624569SSami Tolvanen  */
11*fa624569SSami Tolvanen 
12*fa624569SSami Tolvanen /* Kernel macros for userspace testing. */
13*fa624569SSami Tolvanen #ifndef __used
14*fa624569SSami Tolvanen #define __used __attribute__((__used__))
15*fa624569SSami Tolvanen #endif
16*fa624569SSami Tolvanen #ifndef __section
17*fa624569SSami Tolvanen #define __section(section) __attribute__((__section__(section)))
18*fa624569SSami Tolvanen #endif
19*fa624569SSami Tolvanen 
20*fa624569SSami Tolvanen #define __GENDWARFKSYMS_EXPORT(sym)				\
21*fa624569SSami Tolvanen 	static typeof(sym) *__gendwarfksyms_ptr_##sym __used	\
22*fa624569SSami Tolvanen 		__section(".discard.gendwarfksyms") = &sym;
23*fa624569SSami Tolvanen 
24*fa624569SSami Tolvanen extern void f(unsigned int arg);
25*fa624569SSami Tolvanen void g(int *arg);
g(int * arg)26*fa624569SSami Tolvanen void g(int *arg) {}
27*fa624569SSami Tolvanen 
28*fa624569SSami Tolvanen struct s;
29*fa624569SSami Tolvanen extern struct s *p;
30*fa624569SSami Tolvanen 
31*fa624569SSami Tolvanen __GENDWARFKSYMS_EXPORT(f);
32*fa624569SSami Tolvanen __GENDWARFKSYMS_EXPORT(g);
33*fa624569SSami Tolvanen __GENDWARFKSYMS_EXPORT(p);
34