在使用llvm-gcc编译驱动程序代码时,在jiffies.h中出现“错误:在#if中除以零”

时间:2010-07-31 22:41:20

标签: kernel llvm

我正在尝试使用llvm-gcc(llvm版本1.7)在linux内核源代码(版本2.6.18.8)中编译驱动程序(linux / drivers / net / zorro8390.c)以用于研究目的,但是我从jiffies.h得到了很多错误:

bash-3.2$ llvm-gcc -D__GNUCC -E -I../../include zorro8390.c -o test.o
In file included from ../../include/linux/lockdep.h:12,
                 from ../../include/linux/spinlock_types.h:12,
                 from ../../include/linux/spinlock.h:78,
                 from ../../include/linux/module.h:10,
                 from zorro8390.c:22:
../../include/linux/list.h:887:2: warning: #warning "don't include kernel headers in userspace"
In file included from zorro8390.c:30:
../../include/linux/jiffies.h:210:31: error: division by zero in #if
../../include/linux/jiffies.h:210:31: error: division by zero in #if
...(a bunch of same errors)
../../include/linux/jiffies.h:432:28: error: division by zero in #if

我已经搜索了很多关于此错误的讨论,但很多都是关于使用make命令构建内核。我直接使用llvm-gcc时仍然不知道如何修复它。有什么建议吗?非常感谢你的帮助!

丹尼尔

4 个答案:

答案 0 :(得分:1)

您几乎肯定会收到此错误,因为在手动编译Linux内核源文件时,您尚未定义需要在命令行中定义的许多内容。此消息也是一个提示:

linux/list.h:887:2: warning: #warning "don't include kernel headers in userspace"

你应该在make命令行上使用V = 1进行内核的正常构建,将输出记录到文件中,并挖出zorro8390.c的行 - 这将告诉你额外的你需要的-D开关。可能还有其他必要的(-I,-include等)。

答案 1 :(得分:0)

jiffies是内核的内部时钟周期,取决于名为HZ的定义,其中iirc是jiffies /秒的数量。这通常是一个配置常量(我记得它曾经从100到1024,也许现在更多)。并且HZ通常用于分区,因此div / 0错误。

所以这些是@Zack正确提到的问题;你没有配置定义等。但你可以尝试定义HZ(或今天所谓的),看看你是否可以使它工作。

答案 2 :(得分:0)

在交叉编译访问内核头文件的程序(ti-davinci工具集)时遇到了同样的错误,我使用here上的信息对其进行了整理。

  

打包分发头文件的正确方法是从内核源目录运行'make headers_install',将头文件安装到/ usr / include中,然后重建C库包,依赖于特定版本刚刚安装的内核头文件。

这在我的内核源目录中创建了一个/ usr / include文件夹,其中包含要包含的头文件。

答案 3 :(得分:0)

在我的情况下,#include <linux/time.h>位于标题中,但time.h标题文件从... osprey/obj/include/linux中丢失。一旦我将标题添加到out文件夹,错误就解决了。 linux/time.h具有所需的正确定义 出于某种原因,它在拾取丢失的文件之前就收到了错误。