【发布时间】:2014-07-30 08:15:25
【问题描述】:
我正在尝试为sbc1651 编写一个模块。由于设备是ARM,这需要交叉编译。首先,我正在尝试编译找到here 的“Hello Kernel”模块。这在我的 x86 开发系统上编译得很好,但是当我尝试交叉编译时,我收到以下警告。
/home/developer/HelloKernel/hello-1.mod.c:14: warning: missing initializer
/home/developer/HelloKernel/hello-1.mod.c:14: warning: (near initialization for '__this_module.arch.unw_sec_init')
因为这是在自动生成的 .mod.c 文件中,所以我不知道发生了什么。 mod.c 文件似乎是由 module.h 文件生成的。据我所知,我的 x86 系统的 module.h 和 arm 内核头文件的 module.h 之间的相关部分是相同的。
让我更加困惑的是,这个问题要么无法通过谷歌搜索(我......),要么之前没有发生在任何人身上。或者我只是在做一些任何有理智的人都不会做的毫无头绪的事情。
我使用的交叉编译器是由飞思卡尔提供的(我认为)。我想这可能是编译器的问题。是否值得尝试自己构建工具链?显然,既然是警告,我可以无视它,但既然它那么奇怪,我很担心,至少想知道原因……
非常感谢,
颂波
这里是源文件
你好-1.mod.c
#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>
MODULE_INFO(vermagic, VERMAGIC_STRING);
struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
.name = KBUILD_MODNAME,
.init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
.exit = cleanup_module,
#endif
.arch = MODULE_ARCH_INIT,
};
static const struct modversion_info ____versions[]
__used
__attribute__((section("__versions"))) = {
{ 0x3972220f, "module_layout" },
{ 0xefd6cf06, "__aeabi_unwind_cpp_pr0" },
{ 0xea147363, "printk" },
};
static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
"depends=";
hello-1.c(根据给定链接稍作修改)
/* hello-1.c - The simplest kernel module.
*
* Copyright (C) 2001 by Peter Jay Salzman
*
* 08/02/2006 - Updated by Rodrigo Rubira Branco <rodrigo@kernelhacking.com>
*/
/* Kernel Programming */
#ifndef MODULE
#define MODULE
#endif
#ifndef LINUX
#define LINUX
#endif
#ifndef __KERNEL__
#define __KERNEL__
#endif
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_ALERT */
static int hello_init_module(void)
{
printk(KERN_ALERT "Hello world 1.\n");
/* A non 0 return means init_module failed; module can't be loaded.*/
return 0;
}
static void hello_cleanup_module(void)
{
printk(KERN_ALERT "Goodbye world 1.\n");
}
module_init(hello_init_module);
module_exit(hello_cleanup_module);
MODULE_LICENSE("GPL");
生成文件
export ARCH:=arm
export CCPREFIX:=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-linux-
export CROSS_COMPILE:=${CCPREFIX}
TARGET := hello-1
WARN := -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wno-sign-compare -Wno-unused -Werror
UNUSED_FLAGS := -std=c99 -pedantic
EXTRA_CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
KDIR ?= /home/developer/src/ltib-microsys/ltib/rpm/BUILD/linux-2.6.35.3
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := $(TARGET).o
else
# normal makefile
default: clean
$(MAKE) -C $(KDIR) M=$$PWD
.PHONY: clean
clean:
-rm built-in.o
-rm $(TARGET).ko
-rm $(TARGET).ko.unsigned
-rm $(TARGET).mod.c
-rm $(TARGET).mod.o
-rm $(TARGET).o
-rm modules.order
-rm Module.symvers
endif
【问题讨论】:
-
您好,欢迎来到 SO。您能否编辑您的问题以澄清您遇到哪些错误以及何时收到?标题中的错误是你在本地编译时看到的警告?但问题中的错误是当你交叉编译时?
-
嗨@Deepend,错误是一样的,只是我将标题中的错误压缩到一行以使其不那么笨拙。谢谢,Sompom
-
当预处理器到达第 14 行时,宏 MODULE_ARCH_INIT 似乎未定义。也许它在常规编译器 makefile 中,而不是在交叉编译器 makefile 中?
-
嗯。我复制了相同的 Makefile,只添加了前三个“导出”行以使其交叉编译。我对该宏的引用是 lxr.free-electrons.com/source/include/linux/… 。交叉编译的内核头文件在同一个地方有相同的引用。该行对我来说没有任何意义,因为如果将其定义为 {},它将什么也不做。但我想这就是我所看到的。
-
@Deepend 您上次的编辑建议是不正确的,我认为:OP 将其归类为警告而不是错误是正确的,并且已经解释了它是在交叉编译时发生的。
标签: c cross-compiling kernel-module