错误:使用“ designated_init”属性[-Werror = designated-init]声明的“结构”中字段的位置初始化

时间:2019-03-19 10:08:01

标签: c linux-kernel kernel-module

我正在尝试为4.6.x内核调整旧的内核模块(为2.6.x内核编写)。

该代码具有一个结构声明,如下所示:

struct tcpsp_sysctl_table {
    struct ctl_table_header *sysctl_header;
    struct ctl_table tcpsp_vars[NET_TCPSP_LAST];
    struct ctl_table tcpsp_dir[2];
    struct ctl_table root_dir[2];
};

结构初始化写为:

static struct tcpsp_sysctl_table tcpsp_table = {
        NULL,
        {{NET_TCPSP_TO_ES, "timeout_established",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_ESTABLISHED],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_SS, "timeout_synsent",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_SYN_SENT],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_SR, "timeout_synrecv",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_SYN_RECV],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_FW, "timeout_finwait",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_FIN_WAIT],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_TW, "timeout_timewait",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_TIME_WAIT],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_CL, "timeout_close",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_CLOSE],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_CW, "timeout_closewait",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_CLOSE_WAIT],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_LA, "timeout_lastack",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_LAST_ACK],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_LI, "timeout_listen",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_LISTEN],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_SA, "timeout_synack",
          &tcpsp_timeout_tbl.timeout[TCPSP_S_SYNACK],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_DEBUG_LEVEL, "debug_level",
          &sysctl_tcpsp_debug_level, sizeof(int), 0644, NULL,
          &proc_dointvec},
         {0}},
        {{NET_TCPSP, "tcpsp", NULL, 0, 0555, tcpsp_table.tcpsp_vars},
         {0}},
        {{CTL_NET, "net", NULL, 0, 0555, tcpsp_table.tcpsp_dir},
         {0}}
    };

编译模块时,出现与以下代码行有关的错误:

  

错误:“ struct”中字段的位置初始化声明为   ‘designated_init’属性[-Werror = designated-init]
  {{NET_TCPSP_TO_ES,“超时已建立”,

这与新的C风格编程有关还是存在语法问题。我真的不明白发生了什么。

1 个答案:

答案 0 :(得分:3)

struct ctl_table现在受制于随机结构布局。这意味着此类结构的初始化程序必须使用指定的初始化程序-这些初始化程序会明确命名结构中的每个字段。自编写代码的内核版本以来,struct ctl_table中的字段也已更改-最初的ctl_name成员已不存在。

您可以这样更新它:

static struct tcpsp_sysctl_table tcpsp_table = {
        NULL,
        {{/* NET_TCPSP_TO_ES */
          .procname = "timeout_established",
          .data = &tcpsp_timeout_tbl.timeout[TCPSP_S_ESTABLISHED],
          .maxlen = sizeof(int),
          .mode = 0644,
          .child = NULL,
          .proc_handler = &proc_dointvec_jiffies},
         {/* NET_TCPSP_TO_SS */
          .procname = "timeout_synsent",
          .data = &tcpsp_timeout_tbl.timeout[TCPSP_S_SYN_SENT],
          .maxlen = sizeof(int),
          .mode = 0644,
          .child = NULL,
          .proc_handler = &proc_dointvec_jiffies},
        /* ... */