【发布时间】:2023-03-06 07:10:01
【问题描述】:
每当我尝试使用内核源代码时(无论是上游到更高的 Linux 稳定版本、添加功能等),编译时随机源文件都会失败。
例如,我尝试将内核版本从 v3.18.110 升级到 3.18.125(当然,一次只有一个版本)。我成功解决了所有出现的冲突,但是当我开始构建内核时,编译器发现文件中的错误甚至不在冲突文件中。解决出现的错误会在同一个文件或其他文件中引入更多错误。
我尝试的另一件事是添加州长。我成功地在需要的地方添加了代码,添加了原始的调控器源文件,然后在默认配置中启用它,然后开始编译。在此之后,编译器在调速器的 .c 文件中发现了一些错误。为什么?
我不是要求解决错误,我想知道为什么会首先发生错误。
架构是 arm64,工具链是: https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
示例: 我正在尝试通过编辑这些文件来添加调速器:
驱动程序/cpufreq/Kconfig
驱动程序/cpufreq/Makefile
包括/linux/cpufreq.h
Kconfig:
config CPU_FREQ_DEFAULT_GOV_SMARTMAX
bool "smartmax"
select CPU_FREQ_GOV_SMARTMAX
help
Use the CPUFreq governor 'smartmax' as default
config CPU_FREQ_GOV_SMARTMAX
tristate "'smartmax' cpufreq policy governor"
select CPU_FREQ_TABLE
help
'smartmax' combined ondemand and smartass2
生成文件:
obj-$(CONFIG_CPU_FREQ_GOV_SMARTMAX) += cpufreq_smartmax.o
cpufreq.h:
#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_SMARTMAX)
extern struct cpufreq_governor cpufreq_gov_smartmax;
#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_smartmax)
之后,我添加了调控器的 .c 文件(这是未修改的完全原始调控器代码),然后将其添加到我的设备的默认配置中:
CONFIG_CPU_FREQ_GOV_SMARTMAX=y
然后我转到工具链文件夹,打开终端并输入:
export CROSS_COMPILE=$(pwd)/bin/aarch64-linux-android-
export ARCH=arm64 && export SUBARCH=arm64
之后,我进入内核文件夹并使用以下命令:
make clean
make mrproper
make *my_device_config_name*
make -s -j$(nproc --all)
执行所有这些操作会导致调控器代码中出现以下错误:
drivers/cpufreq/cpufreq_smartmax.c:在函数“cpufreq_smartmax_timer”中: 驱动程序/cpufreq/cpufreq_smartmax.c:522:3:错误:函数“__cpufreq_driver_getavg”的隐式声明 [-Werror=implicit-function-declaration] freq_avg = __cpufreq_driver_getavg(policy, j);
drivers/cpufreq/cpufreq_smartmax.c:在函数“store_debug_mask”中: 驱动程序/cpufreq/cpufreq_smartmax.c:607:2:错误:函数“strict_strtoul”的隐式声明 [-Werror=implicit-function-declaration] res = strict_strtoul(buf, 0, &input);
【问题讨论】:
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及重现它所需的最短代码在问题本身。没有明确的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。
-
您想知道错误发生的原因,但没有提供足够的详细信息:您使用的架构、命令行、配置......以及错误消息本身。我建议你尝试编译内核而不做任何修改。因此,您将确定问题不在您的修改中。
-
@Tsyvarev 你说得对,我忘了添加这个信息......编辑了这个问题。我已经尝试在不进行任何修改的情况下构建源代码,它构建成功。仅添加小的修改会导致新添加的 .c 文件(如果有)或当前存在的源文件中出现错误。我将添加错误消息...
-
文件
drivers/cpufreq/cpufreq_smartmax.c的编译很大程度上取决于您修改过的文件drivers/cpufreq/Kconfig和drivers/cpufreq/Makefile的内容。如果不查看您的修改,就很难猜出问题的原因。 (提示:函数__cpufreq_driver_getavg最有可能在/drivers/cpufreq/cpufreq.c中定义。检查给定文件是否包含该函数以及给定文件是否已实际编译。) -
@Tsyvarev 添加了我修改的内容。 cpufreq.c 中没有定义函数
cpufreq_driver_getavg。文件被编译。