【问题标题】:Android kernel build error: core_ctl.c - dereferencing pointer to incomplete typeAndroid 内核构建错误:core_ctl.c - 取消引用指向不完整类型的指针
【发布时间】:2023-03-12 01:00:01
【问题描述】:

这个内核使用 ARM GCC 工具链构建得很好。由于某种原因,aarch64 工具链抛出了这个错误。

kernel/sched/core_ctl.c: In function 'cpufreq_gov_cb':
kernel/sched/core_ctl.c:1086:25: error: dereferencing pointer to incomplete type
   core_ctl_set_busy(info->cpu, info->load);
                         ^
kernel/sched/core_ctl.c:1086:36: error: dereferencing pointer to incomplete type
   core_ctl_set_busy(info->cpu, info->load);
                                    ^
scripts/Makefile.build:257: recipe for target 'kernel/sched/core_ctl.o' failed

这是定义“cpu”的文件开头的结构(在c文件中找不到负载):

#include <linux/init.h>
#include <linux/notifier.h>
#include <linux/cpu.h>
#include <linux/cpumask.h>
#include <linux/cpufreq.h>
#include <linux/timer.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/sched/rt.h>
#include <linux/mutex.h>

#include <trace/events/sched.h>

#define MAX_CPUS_PER_GROUP 4

struct cpu_data {
    /* Per CPU data. */
    bool    inited;
    bool    online;
    bool    rejected;
    bool    is_busy;
    bool    not_preferred;
    unsigned int busy;
    unsigned int cpu;
    struct list_head sib;
    unsigned int first_cpu;
    struct list_head pending_sib;

    /* Per cluster data set only on first CPU */
    unsigned int min_cpus;
    unsigned int max_cpus;
    unsigned int offline_delay_ms;
    unsigned int busy_up_thres[MAX_CPUS_PER_GROUP];
    unsigned int busy_down_thres[MAX_CPUS_PER_GROUP];
    unsigned int online_cpus;
    unsigned int avail_cpus;
    unsigned int num_cpus;
    unsigned int need_cpus;
    unsigned int task_thres;
    s64 need_ts;
    struct list_head lru;
    bool pending;
    spinlock_t pending_lock;
    bool is_big_cluster;
    int nrrun;
    bool nrrun_changed;
    struct timer_list timer;
    struct task_struct *hotplug_thread;
    struct kobject kobj;
    struct list_head pending_lru;
    bool disabled;
};

什么会使编译器报告不完整的类型?我对C中的指针和结构还不太熟悉..无法弄清楚。

【问题讨论】:

  • 你需要找到用于info变量的类型的定义,而不是cpu一个。

标签: android c gcc linux-kernel


【解决方案1】:

在您的机器上编译 kernel/sched/core_ctl.c 时,似乎缺少 struct cpufreq_govinfo 的头文件。

struct cpufreq_govinfo {
 unsigned int cpu;
 unsigned int load;
 unsigned int sampling_rate_us;
};

在我的机器(ARM:CortexA7)上,GCC 编译器不会抛出编译错误,因为正确包含以下头文件。

  kernel/include/linux/cpufreq.h

此外,以下补丁将使您能够在构建 Linux Kernel 后对文件进行预处理。

diff --git a/Makefile b/Makefile
index b03ca98..f52240c 100644
--- a/Makefile
+++ b/Makefile
@@ -406,6 +406,7 @@ KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                   -fno-strict-aliasing -fno-common \
                   -Werror-implicit-function-declaration \
                   -Wno-format-security \
+                  -save-temps=obj \
                   -std=gnu89

如果您查看预处理文件 .tmp_core_ctl.i,您将能够看到编译 core_ctl.c 的所有头文件

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 2011-04-06
    • 2016-07-12
    • 2018-05-31
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多