2017-08-07 20 views
0

このカーネルは、ARM GCCツールチェーンでうまく構築されます。何らかの理由で、aarch64ツールチェーンがこのエラーをスローします。Androidカーネルのビルドエラー:core_ctl.c - 不完全な型へのポインタの逆参照

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のポインタと構造体に精通していない。それを理解することはできません。

+1

をコンパイルするためのヘッダファイルのすべてを見ることができるだろう**の'info'変数のために使われる型で、' cpu'のものではありません。 – Tsyvarev

答えて

0

struct cpufreq_govinfoのヘッダーファイルが、カーネル/ sched/core_ctl.cがマシン上でコンパイルされていると、見付からないようです。

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

私のマシン(ARM:CortexA7)では、以下のヘッドファイルが正しく組み込まれているため、コンパイルエラーは発生しません。

kernel/include/linux/cpufreq.h 

さらに、次のパッチを適用すると、Linuxカーネルをビルドした後に前処理されたファイルを作成することができます。

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

関連する問題