我正在尝试使用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时仍然不知道如何修复它。有什么建议吗?非常感谢你的帮助!
丹尼尔
答案 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
具有所需的正确定义
出于某种原因,它在拾取丢失的文件之前就收到了错误。