111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*	$NetBSD: cdefs_elf.h,v 1.22 2005/02/26 22:25:34 perry Exp $	*/
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1995, 1996 Carnegie-Mellon University.
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * All rights reserved.
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Author: Chris G. Demetriou
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use, copy, modify and distribute this software and
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * its documentation is hereby granted, provided that both the copyright
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * notice and this permission notice appear in all copies of the
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * software, derivative works or modified versions, and any portions
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * thereof, and that both notices appear in supporting documentation.
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Carnegie Mellon requests users of this software to return to
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  School of Computer Science
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Carnegie Mellon University
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Pittsburgh PA 15213-3890
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * any improvements or extensions that they make and grant Carnegie the
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * rights to redistribute these changes.
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _SYS_CDEFS_ELF_H_
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_SYS_CDEFS_ELF_H_
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __LEADING_UNDERSCORE
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_C_LABEL(x)	__CONCAT(_,x)
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _C_LABEL_STRING(x)	"_" x
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_C_LABEL(x)	x
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _C_LABEL_STRING(x)	x
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	___RENAME(x)	__asm__(___STRING(_C_LABEL(x)))
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__indr_reference(sym,alias)	/* nada, since we do weak refs */
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__strong_alias(alias,sym)	       				\
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __asm__(".global " _C_LABEL_STRING(#alias) "\n"			\
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    _C_LABEL_STRING(#alias) " = " _C_LABEL_STRING(#sym));
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__weak_alias(alias,sym)						\
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __asm__(".weak " _C_LABEL_STRING(#alias) "\n"			\
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    _C_LABEL_STRING(#alias) " = " _C_LABEL_STRING(#sym));
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__weak_extern(sym)						\
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __asm__(".weak " _C_LABEL_STRING(#sym));
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* We use __warnattr instead of __warn_references.
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * TODO: remove this and put an empty definition in one of the upstream-* compatibility headers.
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__warn_references(sym,msg)					\
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /*__asm__(".section .gnu.warning." #sym "\n\t.ascii \"" msg "\"\n\t.text");*/
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SECTIONSTRING(_sec, _str)					\
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__asm__(".section " #_sec "\n\t.asciz \"" _str "\"\n\t.previous")
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Used to tag non-static symbols that are private and never exposed by the shared library. */
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __LIBC_HIDDEN__ __attribute__((visibility ("hidden")))
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Like __LIBC_HIDDEN__, but preserves binary compatibility for LP32. */
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __LP64__
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __LIBC64_HIDDEN__ __LIBC_HIDDEN__
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __LIBC64_HIDDEN__ __LIBC_ABI_PUBLIC__
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Used to tag non-static symbols that are public and exposed by the shared library. */
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __LIBC_ABI_PUBLIC__ __attribute__((visibility ("default")))
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__IDSTRING(_n,_s)		__SECTIONSTRING(.ident,_s)
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__RCSID(_s)			__IDSTRING(rcsid,_s)
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SCCSID(_s)
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __SCCSID2(_s)
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0	/* XXX userland __COPYRIGHTs have \ns in them */
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__COPYRIGHT(_s)			__SECTIONSTRING(.copyright,_s)
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__COPYRIGHT(_s)							\
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static const char copyright[]					\
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __attribute__((__unused__,__section__(".copyright"))) = _s
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__KERNEL_RCSID(_n, _s)		__RCSID(_s)
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__KERNEL_SCCSID(_n, _s)
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0	/* XXX see above */
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__KERNEL_COPYRIGHT(_n, _s)	__COPYRIGHT(_s)
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__KERNEL_COPYRIGHT(_n, _s)	__SECTIONSTRING(.copyright, _s)
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __lint__
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_make_entry(set, sym)					\
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static void const * const __link_set_##set##_sym_##sym		\
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __section("link_set_" #set) __used = &sym
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_make_entry2(set, sym, n)				\
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static void const * const __link_set_##set##_sym_##sym##_##n	\
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __section("link_set_" #set) __used = &sym[n]
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_make_entry(set, sym)					\
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	extern void const * const __link_set_##set##_sym_##sym
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_make_entry2(set, sym, n)				\
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	extern void const * const __link_set_##set##_sym_##sym##_##n
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* __lint__ */
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_add_text(set, sym)	__link_set_make_entry(set, sym)
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_add_rodata(set, sym)	__link_set_make_entry(set, sym)
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_add_data(set, sym)	__link_set_make_entry(set, sym)
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_add_bss(set, sym)	__link_set_make_entry(set, sym)
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_add_text2(set, sym, n)   __link_set_make_entry2(set, sym, n)
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_add_rodata2(set, sym, n) __link_set_make_entry2(set, sym, n)
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_add_data2(set, sym, n)   __link_set_make_entry2(set, sym, n)
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_add_bss2(set, sym, n)    __link_set_make_entry2(set, sym, n)
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_decl(set, ptype)					\
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	extern ptype * const __start_link_set_##set[];			\
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	extern ptype * const __stop_link_set_##set[]			\
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_start(set)	(__start_link_set_##set)
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_end(set)	(__stop_link_set_##set)
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__link_set_count(set)						\
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(__link_set_end(set) - __link_set_start(set))
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !_SYS_CDEFS_ELF_H_ */
132