cdefs_elf.h revision f79ee064b64af54bce6d3931f4112761edb7d3a9
1/*	$NetBSD: cdefs_elf.h,v 1.22 2005/02/26 22:25:34 perry Exp $	*/
2
3/*
4 * Copyright (c) 1995, 1996 Carnegie-Mellon University.
5 * All rights reserved.
6 *
7 * Author: Chris G. Demetriou
8 *
9 * Permission to use, copy, modify and distribute this software and
10 * its documentation is hereby granted, provided that both the copyright
11 * notice and this permission notice appear in all copies of the
12 * software, derivative works or modified versions, and any portions
13 * thereof, and that both notices appear in supporting documentation.
14 *
15 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
17 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18 *
19 * Carnegie Mellon requests users of this software to return to
20 *
21 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
22 *  School of Computer Science
23 *  Carnegie Mellon University
24 *  Pittsburgh PA 15213-3890
25 *
26 * any improvements or extensions that they make and grant Carnegie the
27 * rights to redistribute these changes.
28 */
29
30#ifndef _SYS_CDEFS_ELF_H_
31#define	_SYS_CDEFS_ELF_H_
32
33#ifdef __LEADING_UNDERSCORE
34#define	_C_LABEL(x)	__CONCAT(_,x)
35#define _C_LABEL_STRING(x)	"_"x
36#else
37#define	_C_LABEL(x)	x
38#define _C_LABEL_STRING(x)	x
39#endif
40
41#define	___RENAME(x)	__asm__(___STRING(_C_LABEL(x)))
42
43#define	__indr_reference(sym,alias)	/* nada, since we do weak refs */
44
45#define	__strong_alias(alias,sym)	       				\
46    __asm__(".global " _C_LABEL_STRING(#alias) "\n"			\
47	    _C_LABEL_STRING(#alias) " = " _C_LABEL_STRING(#sym));
48
49#define	__weak_alias(alias,sym)						\
50    __asm__(".weak " _C_LABEL_STRING(#alias) "\n"			\
51	    _C_LABEL_STRING(#alias) " = " _C_LABEL_STRING(#sym));
52#define	__weak_extern(sym)						\
53    __asm__(".weak " _C_LABEL_STRING(#sym));
54
55/* We use __warnattr instead of __warn_references.
56 * TODO: remove this and put an empty definition in one of the upstream-* compatibility headers.
57 */
58#define	__warn_references(sym,msg)					\
59    /*__asm__(".section .gnu.warning." #sym "\n\t.ascii \"" msg "\"\n\t.text");*/
60
61#define	__SECTIONSTRING(_sec, _str)					\
62	__asm__(".section " #_sec "\n\t.asciz \"" _str "\"\n\t.previous")
63
64/* Used to tag non-static symbols that are private and never exposed by the shared library. */
65#define __LIBC_HIDDEN__ __attribute__((visibility ("hidden")))
66
67/* Like __LIBC_HIDDEN__, but preserves binary compatibility for LP32. */
68#ifdef __LP64__
69#define __LIBC64_HIDDEN__ __LIBC_HIDDEN__
70#else
71#define __LIBC64_HIDDEN__
72#endif
73
74/* Used to tag non-static symbols that are public and exposed by the shared library. */
75#define __LIBC_ABI_PUBLIC__ __attribute__((visibility ("default")))
76
77#define	__IDSTRING(_n,_s)		__SECTIONSTRING(.ident,_s)
78
79#define	__RCSID(_s)			__IDSTRING(rcsid,_s)
80#define	__SCCSID(_s)
81#define __SCCSID2(_s)
82#if 0	/* XXX userland __COPYRIGHTs have \ns in them */
83#define	__COPYRIGHT(_s)			__SECTIONSTRING(.copyright,_s)
84#else
85#define	__COPYRIGHT(_s)							\
86	static const char copyright[]					\
87	    __attribute__((__unused__,__section__(".copyright"))) = _s
88#endif
89
90#define	__KERNEL_RCSID(_n, _s)		__RCSID(_s)
91#define	__KERNEL_SCCSID(_n, _s)
92#if 0	/* XXX see above */
93#define	__KERNEL_COPYRIGHT(_n, _s)	__COPYRIGHT(_s)
94#else
95#define	__KERNEL_COPYRIGHT(_n, _s)	__SECTIONSTRING(.copyright, _s)
96#endif
97
98#ifndef __lint__
99#define	__link_set_make_entry(set, sym)					\
100	static void const * const __link_set_##set##_sym_##sym		\
101	    __section("link_set_" #set) __used = &sym
102#define	__link_set_make_entry2(set, sym, n)				\
103	static void const * const __link_set_##set##_sym_##sym##_##n	\
104	    __section("link_set_" #set) __used = &sym[n]
105#else
106#define	__link_set_make_entry(set, sym)					\
107	extern void const * const __link_set_##set##_sym_##sym
108#define	__link_set_make_entry2(set, sym, n)				\
109	extern void const * const __link_set_##set##_sym_##sym##_##n
110#endif /* __lint__ */
111
112#define	__link_set_add_text(set, sym)	__link_set_make_entry(set, sym)
113#define	__link_set_add_rodata(set, sym)	__link_set_make_entry(set, sym)
114#define	__link_set_add_data(set, sym)	__link_set_make_entry(set, sym)
115#define	__link_set_add_bss(set, sym)	__link_set_make_entry(set, sym)
116#define	__link_set_add_text2(set, sym, n)   __link_set_make_entry2(set, sym, n)
117#define	__link_set_add_rodata2(set, sym, n) __link_set_make_entry2(set, sym, n)
118#define	__link_set_add_data2(set, sym, n)   __link_set_make_entry2(set, sym, n)
119#define	__link_set_add_bss2(set, sym, n)    __link_set_make_entry2(set, sym, n)
120
121#define	__link_set_decl(set, ptype)					\
122	extern ptype * const __start_link_set_##set[];			\
123	extern ptype * const __stop_link_set_##set[]			\
124
125#define	__link_set_start(set)	(__start_link_set_##set)
126#define	__link_set_end(set)	(__stop_link_set_##set)
127
128#define	__link_set_count(set)						\
129	(__link_set_end(set) - __link_set_start(set))
130
131#endif /* !_SYS_CDEFS_ELF_H_ */
132