【问题标题】:Kernel compiling errors with every modification每次修改时内核编译错误
【发布时间】: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/Kconfigdrivers/cpufreq/Makefile 的内容。如果不查看您的修改,就很难猜出问题的原因。 (提示:函数__cpufreq_driver_getavg 最有可能在/drivers/cpufreq/cpufreq.c 中定义。检查给定文件是否包含该函数以及给定文件是否已实际编译。)
  • @Tsyvarev 添加了我修改的内容。 cpufreq.c 中没有定义函数cpufreq_driver_getavg。文件被编译。

标签: android linux git kernel


【解决方案1】:

smartmax cpufreq 调控器是为较旧的 Linux 内核(可能是 3.4 之前的内核)设计的。因此,它仍然引用了几个过时的内核 API 和函数。由于这些 API 在 Linux 3.18 中不再存在,因此会出现编译错误。


drivers/cpufreq/cpufreq_smartmax.c:在函数“cpufreq_smartmax_timer”中:drivers/cpufreq/cpufreq_smartmax.c:522:3:错误:函数“__cpufreq_driver_getavg”的隐式声明[-Werror=implicit-function-declaration]freq_avg = __cpufreq_driver_getavg(policy, j);

具体来说,这个错误是由控制器使用 __cpufreq_driver_getavg() 函数引起的,该函数在 Linux 3.18 中不再存在。事实上,该功能已在 5 年前的 2013 年 Linux 3.12 中删除。要修复编译错误,您可以恢复该提交并解决任何 Git 冲突。但是,在此过程中可能仍然存在其他问题(兼容性、编译等)。

drivers/cpufreq/cpufreq_smartmax.c:在函数“store_debug_mask”中:drivers/cpufreq/cpufreq_smartmax.c:607:2:错误:函数“strict_strtoul”的隐式声明 [-Werror=implicit-function-declaration] res = strict_strtoul(buf, 0, &input);

同样,strict_strtoul() 是另一个不再出现在 Linux 3.18 中的函数,但仍然被 smartmax 调控器使用。值得庆幸的是,这个问题很容易解决。您可以简单地将 strict_strtoul 的任何用途替换为 kstrtoul,它几乎可以服务于 same purpose


我相当确定 smartmax 调控器依赖于其他过时或已删除的内核 API 和函数。您可以尝试更新 Linux 3.18 的调控器,但这可能不值得花费时间和精力。

【讨论】:

  • 哇,没想到这个……嗯,知道这很有用。谢谢你。所以,可能我现在唯一想知道的是,为什么当我将内核版本从 3.18.120 升级到 3.18.125 时会出现一些我不知道如何修复的错误,如果我分享你会帮助我吗是吗?
  • 如果你分享它,我会看看我能帮你什么。
猜你喜欢
  • 1970-01-01
  • 2017-07-30
  • 2010-12-06
  • 2015-10-14
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多