arm gcc5的交叉编译-正确使用memcpy

Posted

技术标签:

【中文标题】arm gcc5的交叉编译-正确使用memcpy【英文标题】:Cross compiling for arm gcc5 - Proper use of memcpy 【发布时间】: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 构建,那就“很好”。 【参考方案1】:

确实有人足够聪明: 结构 phydev 常量字符*名称; ...

删除了 const,一切都很好(至少 memcpy 行。但我可以使用 strcpy 或 strdup 或其他任何东西。它试图写入一个常量。

在调试完所有其他错误后,我能够制作 U-Boot 映像。还没测试。

此外,将许多函数设为静态,而不是将使用过的静态变量复制到本地属性中。不知道它会做什么......(可能会因一些分段错误或其他原因而崩溃:-)。

我现在必须等待我的 ttl USB 适配器...

除非有人知道在哪里可以找到这个东西的 adb 驱动程序并且它支持 fw_setenv 什么的......

猜想一旦 ttl 适配器到达,它会按 tty1 上的空格键。

感谢大家的帮助。如果我设法在这个盒子上安装 Ubuntu,我会发布一篇关于它的博客:-)

干杯,谢谢

维姆

【讨论】:

以上是关于arm gcc5的交叉编译-正确使用memcpy的主要内容,如果未能解决你的问题,请参考以下文章

arm交叉编译lighttpd问题。

如何安装arm-liunx交叉编译环境?

关于Linux上的arm-linux交叉编译工具链的问题:但是arm也有很多种啊! 这个工具是对所有的ARM都支持吗?

arm交叉编译工具链下载

交叉工具链的搭建方法

使用 Autoconf 为 ARM 进行交叉编译