I am trying to write a module for an sbc1651. Since the device is ARM, this requires a cross-compile. As a start, I am trying to compile the "Hello
Kernel" module found here. This compiles fine on my x86 development system, but when I try to cross-compile I get the below error.
/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')
Since this is in the .mod.c file, which is autogenerated I have no idea what's going on. The mod.c file seems to be generated by the module.h file. As far as I can tell, the relevant parts are the same between my x86 system's module.h and the arm
kernel header's module.h.
Adding to my confusion, this problem is either not googleable (by me...) or hasn't happened to anyone before. Or I'm just doing something clueless that anyone with any sense wouldn't do.
The cross-compiler I'm using was supplied by Freescale (I think). I suppose it could be a problem with the compiler. Would it be worth trying to build the toolchain myself? Obviously, since this is a warning, I could ignore it, but since it's so strange, I am worried about it, and would like to at least know the cause...
Thanks very much,
Sompom
Here are the source files
hello-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 (modified slightly from the given link)
/* hello-1.c - The simplest
kernel module.
*
* Copyright (C) 2001 by Peter Jay Salzman
*
* 08/02/2006 - Updated by Rodrigo Rubira Branco <
[email protected]>
*/
/*
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");
Makefile
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