【问题标题】:Compile the same C code for user space as well as kernel space为用户空间和内核空间编译相同的 C 代码
【发布时间】:2017-07-25 02:10:07
【问题描述】:

假设我有一个 .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 来编译它,它注意用 mallocfree 替换内核特定的调用,如 kmallockfree ?我如何使用#ifdef #else #endif 的各种组合,以便通过使用各自的make文件在用户空间和内核空间中编译文件。

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

【问题讨论】:

  • 听起来像是 XY 问题。重构代码并将其拆分为不同的模块。如果它与内核函数深度交织,那么将其用于用户空间也是一个坏主意。

标签: c makefile kernel


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多