为用户空间和内核空间编译相同的C代码

时间:2017-03-05 05:08:03

标签: c makefile kernel

假设我有一个.h和.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文件包含void insert_node fn的定义,它使用kmalloc()创建tree_node并将其插入树中。我可以使用Makefile编译代码来编译内核模块,因为.h / .c文件是内核模块的一部分。

现在,我想在用户空间中使用相同的数据结构及其fns。我需要使用新的用户空间特定的makefile来编译它,这需要用kmallockfree替换特定于内核的调用,例如mallocfree?如何使用#ifdef #else #endif的各种组合,以便通过使用相应的make文件在用户空间和内核空间中编译文件。

请等待:kmalloc/kfree只是解释的简单例子。文件包含其他特定于内核的API,在用户空间中编译文件时需要将其排除/替换。

1 个答案:

答案 0 :(得分:2)

您可以使用cannot find symbol宏来区分编译目标:内核代码(已定义宏)或应用程序(未定义宏)。

这个宏在Linux内核中用于 uapi 标头和其他一些文件。例如,参见include/uapi/linux/ethtool.h