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