【发布时间】:2016-04-11 02:19:27
【问题描述】:
我正在尝试为 amlogic 的 S805/S812 SoC 编译内核 (uImage)。我已经设法解决了除了一个之外的所有编译错误,可能是因为我对 c++ 和编译器的了解还不够远。让我解释一下存在于文件 phydev.c 中的问题:
给出错误的行是:
memcpy(&phydev->name, &dev_para->name, MAX_DEVICE_NAME_LEN*sizeof(char));
这些是(交叉)编译器错误:
drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/phydev.c: In function ‘amlnand_phydev_init’:
drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/phydev.c:1114:10: error: passing argument 1 of ‘memcpy’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-array-qualifiers]
memcpy(&phydev->name, &dev_para->name, MAX_DEVICE_NAME_LEN*sizeof(char));
^
In file included from include/linux/string.h:17:0,
from include/linux/dynamic_debug.h:111,
from include/linux/kernel.h:14,
from include/linux/cache.h:4,
from include/linux/time.h:4,
from include/linux/stat.h:18,
from include/linux/module.h:10,
from drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/../include/../include/amlnf_type.h:18,
from drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/../include/../include/amlnf_dev.h:4,
from drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/../include/phynand.h:4,
from drivers/amlogic/../../../hardware/amlogic/nand/amlnf/dev/phydev.c:14:
/root/Downloads/Beelink3/arm-src-kernel-2015-01-15-321cfb5a46/arch/arm/include/asm/string.h:16:15:
note: expected ‘void *’ but argument is of type ‘const char (*)[16]’
extern void * memcpy(void *, const void *, __kernel_size_t);
^
几天来我一直在尝试解决这个问题,还尝试直接分配(这显然不适用于数组),使用 strcpy 等等,但这只会产生更多错误,我找不到确切的根本原因。我想我需要某种类型的强制转换或中间常量 void ptr,但我不知道如何解决这个问题。
任何人都可以就这个问题以及如何解决它给我建议。 memcpy 函数定义在 arch/arm/include/asm/string.h 但是弄乱这个文件似乎不是一个好主意。
非常感谢,
维姆
【问题讨论】:
-
看看
&dev_para->name。看起来它可能是const,并且该函数正在采用它可能想要更改的参数。 -
对。复制到 const 对象是禁止的。如果 Linux 内核实际上包含如此草率的代码,我会感到惊讶,所以这里发生了一些更基本的事情。而且我真的不知道 C++ 与此有什么关系。 Linux 内核是用 C 编写的,而不是 C++。
-
该错误表明您正在尝试写入
const对象phydev->name。要解决这个问题,您可以删除memcpy行;如果不看更多代码,很难说任何更有用的东西。不要抛弃 const。查看周围的代码并问自己为什么代码试图更改常量。 -
IOW 您需要了解导致这种情况的逻辑错误,以便进行修复以执行代码尝试执行的操作
-
@Sam “如果 Linux 内核实际上包含如此草率的代码,我会感到惊讶” - 最近尝试使用 GCC 5 构建 mainline stable 2.6.12 以获得傻笑,我不会;)这是一个供应商内核,甚至不是主线,所以标准就在窗外;如果它使用他们选择的任何硬壳 GCC 4.3 构建,那就“很好”。
标签: c++ linux gcc arm cross-compiling