linux/include/asm-generic/export.h
<<
>>
Prefs
   1#ifndef __ASM_GENERIC_EXPORT_H
   2#define __ASM_GENERIC_EXPORT_H
   3
   4#ifndef KSYM_FUNC
   5#define KSYM_FUNC(x) x
   6#endif
   7#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
   8#define KSYM_ALIGN 4
   9#elif defined(CONFIG_64BIT)
  10#define KSYM_ALIGN 8
  11#else
  12#define KSYM_ALIGN 4
  13#endif
  14#ifndef KCRC_ALIGN
  15#define KCRC_ALIGN 4
  16#endif
  17
  18.macro __put, val, name
  19#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
  20        .long   \val - ., \name - ., 0
  21#elif defined(CONFIG_64BIT)
  22        .quad   \val, \name, 0
  23#else
  24        .long   \val, \name, 0
  25#endif
  26.endm
  27
  28/*
  29 * note on .section use: @progbits vs %progbits nastiness doesn't matter,
  30 * since we immediately emit into those sections anyway.
  31 */
  32.macro ___EXPORT_SYMBOL name,val,sec
  33#ifdef CONFIG_MODULES
  34        .globl __ksymtab_\name
  35        .section ___ksymtab\sec+\name,"a"
  36        .balign KSYM_ALIGN
  37__ksymtab_\name:
  38        __put \val, __kstrtab_\name
  39        .previous
  40        .section __ksymtab_strings,"a"
  41__kstrtab_\name:
  42        .asciz "\name"
  43        .previous
  44#ifdef CONFIG_MODVERSIONS
  45        .section ___kcrctab\sec+\name,"a"
  46        .balign KCRC_ALIGN
  47__kcrctab_\name:
  48#if defined(CONFIG_MODULE_REL_CRCS)
  49        .long __crc_\name - .
  50#else
  51        .long __crc_\name
  52#endif
  53        .weak __crc_\name
  54        .previous
  55#endif
  56#endif
  57.endm
  58
  59#if defined(CONFIG_TRIM_UNUSED_KSYMS)
  60
  61#include <linux/kconfig.h>
  62#include <generated/autoksyms.h>
  63
  64.macro __ksym_marker sym
  65        .section ".discard.ksym","a"
  66__ksym_marker_\sym:
  67         .previous
  68.endm
  69
  70#define __EXPORT_SYMBOL(sym, val, sec)                          \
  71        __ksym_marker sym;                                      \
  72        __cond_export_sym(sym, val, sec, __is_defined(__KSYM_##sym))
  73#define __cond_export_sym(sym, val, sec, conf)                  \
  74        ___cond_export_sym(sym, val, sec, conf)
  75#define ___cond_export_sym(sym, val, sec, enabled)              \
  76        __cond_export_sym_##enabled(sym, val, sec)
  77#define __cond_export_sym_1(sym, val, sec) ___EXPORT_SYMBOL sym, val, sec
  78#define __cond_export_sym_0(sym, val, sec) /* nothing */
  79
  80#else
  81#define __EXPORT_SYMBOL(sym, val, sec) ___EXPORT_SYMBOL sym, val, sec
  82#endif
  83
  84#define EXPORT_SYMBOL(name)                                     \
  85        __EXPORT_SYMBOL(name, KSYM_FUNC(name),)
  86#define EXPORT_SYMBOL_GPL(name)                                 \
  87        __EXPORT_SYMBOL(name, KSYM_FUNC(name), _gpl)
  88#define EXPORT_DATA_SYMBOL(name)                                \
  89        __EXPORT_SYMBOL(name, name,)
  90#define EXPORT_DATA_SYMBOL_GPL(name)                            \
  91        __EXPORT_SYMBOL(name, name,_gpl)
  92
  93#endif
  94