【问题标题】:How to specify path of kernel headers for non-kernel app in c?如何在c中为非内核应用程序指定内核头文件的路径?
【发布时间】:2016-05-02 23:21:50
【问题描述】:

我需要使用ioctlfixp_t 键入的数字(定义在<linux/fixp-arith.h>,最初是s16)从内核模块传输到客户端应用程序。数据类型非常重要,如果变量大小不同 - 结果可能非常危险。

如果我在内核和客户端应用程序源代码中都包含<linux/fixp-arith.h>,客户端应用程序将无法编译,因为它找不到 linux 头文件。

另一方面,gcc -I/usr/src/linux-headers-3.16.0-4-common/include/ app.c -o app 不起作用,因为<linux/types.h> 重新定义了现有类型并且编译失败。

另一方面,我不敢自己指定任何数据类型,因为在每个拱门上s16,所以fixp_t 可能不同。

如何解决这个问题?

【问题讨论】:

  • fixp_t 数据类型为removed in 4.1,因此您将来在尝试使用该数据类型时可能会遇到问题。您最好使用自己的数据类型来保证传输,因为 这是您的 ioctl。 (返回类型扩大到s32)
  • @Petesh 好的,但是我应该如何处理返回s16(4.1 之前)和s32 之后的内核函数?我也许可以转换它......但我不知道什么类型会给我内核......
  • 内核模块知道是因为是针对内核头文件编译的。所以转换不是问题。
  • @Frankie_C 但我必须调用一些特定的函数。想象一下我的ioctl 传输结构long int 中有。在 3.16 内核中我得到 s16 结果,如果我尝试将其写入 32 字节整数会发生什么?我的意思是我必须自己进行一些转换。
  • @Frankie_C 明白了。函数名称不同。如果您将此添加为答案,我会接受。

标签: c gcc makefile header-files kernel-module


【解决方案1】:

来自 gcc 手册页:

-I dir 将目录dir添加到要搜索头文件的目录列表中。

所以,添加您将使用的目录:

-I /usr/src/linux-headers-3.16.0-4-common/include/

但是,我认为用户空间程序不应该包含内核头文件。如果你的内核模块有一个用户空间 API,那么这个 API 应该在一个独立于内核头文件并且只依赖于标准头文件的头文件中声明。

【讨论】:

  • 我正在使用ioctl与内核交换数据,数据类型非常重要,因为它的大小应该匹配。在内核模块中,我使用s16 或更具体的fixp_t
  • -I 参数对我不起作用,因为不知何故 linux/types.h 试图再次重新定义类型:(
  • 哪种类型对我们来说是设计决定。您应该使用完全匹配的类型或足够大的类型(然后在模块内将其转换/转换为 fixp_t
【解决方案2】:

使用你想要的定义你自己的ioctl
将精心制作特定的标头,以便可以包含在应用程序和内核中。
根据内核头文件编译的内核模块将进行正确的转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2021-07-16
    • 1970-01-01
    • 2020-08-28
    • 2012-04-21
    相关资源
    最近更新 更多