![](/img/trans.png)
[英]How to check in a single line that none of the pre-processor macros are defined?
[英]How do these pre-processor defined kernel functions work?
我正在嘗試在 Apple M1 上執行一些內核函數,並且遇到了這段代碼,它似乎使用 C 宏在編譯時定義了一些內核函數。 這些是存在於 Apple 的kern/kpc
庫中的內核函數,但該庫的頭文件不包含在任何地方,我相信 API 可能是私有的。
我想知道是否有人可以解釋它是如何工作的,函數定義(即通常在函數體中的代碼)是如何向程序顯示的? 我不熟悉##proc
符號。
#define KPERF_LIST \
/* ret, name, params */ \
F(int, kpc_get_counting, void) \
F(int, kpc_force_all_ctrs_set, int) \
F(int, kpc_set_counting, uint32_t) \
F(int, kpc_set_thread_counting, uint32_t) \
F(int, kpc_set_config, uint32_t, void *) \
F(int, kpc_get_config, uint32_t, void *) \
F(int, kpc_set_period, uint32_t, void *) \
F(int, kpc_get_period, uint32_t, void *) \
F(uint32_t, kpc_get_counter_count, uint32_t) \
F(uint32_t, kpc_get_config_count, uint32_t) \
F(int, kperf_sample_get, int *) \
F(int, kpc_get_thread_counters, int, unsigned int, void *)
#define F(ret, name, ...) \
typedef ret name##proc(__VA_ARGS__); \
static name##proc *name;
KPERF_LIST
#undef F
如果有F(int, kpc_get_counting, void)
第一個是返回值的類型。 第二個是函數名,后面都是參數。
我已經聯系了原始代碼的作者來解決這個問題。
宏定義的函數稍后在代碼中使用dlsym()
鏈接到內核庫函數。 所以,這些函數實際上並沒有在這段代碼中定義; 相反,聲明相同/相似名稱的函數,然后動態鏈接到內核庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.