2

我正在尝试使用 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

4 回答 4

1

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

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

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

于 2010-07-31T22:49:28.340 回答
0

jiffies 是内核的内部时钟滴答,取决于一个名为HZwhich iirc 的定义是 jiffies/second 的数量。这通常是一个配置常量(我记得它曾经从 100 变为 1024,也许现在更多了)。并且HZ通常用于除法,因此 div/0 错误。

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

于 2010-07-31T22:59:06.787 回答
0

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

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

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

于 2013-03-07T09:28:56.630 回答
0

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

于 2016-05-06T03:44:17.640 回答