参照元†
例: ダイナミックリンク有効の場合
libasound.so を nm で見るとたくさん出てくる。
in src/pcm/pcm_hw.c
-------------------
SND_DLSYM_BUILD_VERSION(_snd_pcm_hw_open, SND_PCM_DLSYM_VERSION);
-> __snd_pcm_hw_open_dlsym_pcm_001
^(1)
^^^^^^^^^^^^^^^^(2)
^^^^^^^^^^^^^^(3)
(1): プレフィクス、常に "_" である
(2): name に指定したシンボル名
(3): version に指定したシンボル名
返り値†
#ifdef PIC /* dynamic build */
(...略...)
/**
* \hideinitializer
* \brief Appends the build version to the name of a versioned dynamic symbol.
*/
#define SND_DLSYM_BUILD_VERSION(name, version) char __SND_DLSYM_VERSION(name, version);
- char 型の変数を宣言する。変数名は __SND_DLSYM_VERSION() で決める。
#else /* static build */
(...略...)
/**
* \hideinitializer
* \brief Appends the build version to the name of a versioned dynamic symbol.
*/
#define SND_DLSYM_BUILD_VERSION(name, version) \
static struct snd_dlsym_link __SND_DLSYM_VERSION(snd_dlsym_, name, version); \
void __SND_DLSYM_VERSION(snd_dlsym_constructor_, name, version) (void) __attribute__ ((constructor)); \
void __SND_DLSYM_VERSION(snd_dlsym_constructor_, name, version) (void) { \
__SND_DLSYM_VERSION(snd_dlsym_, name, version).next = snd_dlsym_start; \
__SND_DLSYM_VERSION(snd_dlsym_, name, version).dlsym_name = # name; \
__SND_DLSYM_VERSION(snd_dlsym_, name, version).dlsym_ptr = (void *)&name; \
snd_dlsym_start = &__SND_DLSYM_VERSION(snd_dlsym_, name, version); \
}
#endif
コメント†