2017-03-05 25 views
-2

可以說,我有一個h和.c文件,最初是爲內核空間。編譯爲用戶空間相同的C代碼以及內核空間

#ifndef __TREE_H__ 
#define __TREE_H__ 

/* #includes for kernel headers*/ 

struct tree_node_t{ 
    int data; 
    struct tree_node_t *left; 
    struct tree_node_t *right; 
}; 

struct tree{ 
int data; 
struct tree_node_t *root; 
}; 

void insert_node(struct tree *tree, int data); 
#endif 

可以說,相應的.c文件包含無效insert_node FN的定義,使用kmalloc(),營造出tree_node並將其插入到一棵樹。我能夠使用Makefile編譯代碼來編譯內核模塊,因爲.h/.c文件是內核模塊的一部分。

現在,我想用在用戶空間相同的數據結構和FNS爲好。我需要使用新的用戶空間中的特定的Makefile它負責更換像kmallockfreemallocfree而不是特定的內核調用編譯它?我如何使用#ifdef #else #endif的各種組合,以便通過使用各自的make文件在用戶空間和內核空間中編譯這些文件。

PLS NTE:kmalloc/kfree只是簡單的例子來解釋。文件包含其他內核特定的API,在編譯用戶空間中的文件時需要將其排除/替換。

+0

聽起來像一個XY問題。重構代碼並將其分成不同的模塊。如果它與內核函數深深交織在一起,將它用於用戶空間也是一個壞主意。 – Olaf

回答

2

您可以使用編譯的分化目標__KERNEL__宏:內核代碼(宏定義)或應用程序(沒有定義宏)。

這個宏確實在Linux內核中用於uapi頭文件和其他一些文件。參見例如include/uapi/linux/ethtool.h