【问题标题】:hello-1.mod.c:14: warning: missing initializer (near initialization for '__this_module.arch.unw_sec_init')hello-1.mod.c:14:警告:缺少初始化程序('__this_module.arch.unw_sec_init' 的初始化附近)
【发布时间】: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


【解决方案1】:

显然MODULE_ARCH_INIT 是一个定义为某种{ ... } 初始化程序的宏。 GCC 以在此类初始化程序未涵盖目标聚合中的每个字段时发出过度偏执(和彻头彻尾的恶意)警告而闻名,即使语言规范表明一切正常。

下面是为完全安全(和惯用)= { 0 } 初始化程序发出的警告的示例:Why is the compiler throwing this warning: "missing initializer"? Isn't the structure initialized?

我猜你的 MODULE_ARCH_INIT 被定义为不涵盖目标结构的每个字段并出于相同原因触发相同警告的内容。

该语言保证在这种情况下未覆盖的字段被零初始化,但 GCC 只是不确定是否要使用零来初始化这些字段。因此发出警告。

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多