【问题标题】:How to prevent GCC from passing in default flags?如何防止 GCC 传入默认标志?
【发布时间】:2009-11-01 02:17:43
【问题描述】:

我正在尝试为 ARM 架构交叉编译 linux。

主机是运行 ubuntu-jaunty 的 X86 机器。我从http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 下载了 ARM 的交叉编译工具链。我下载了2.95.3版本的工具链。

我遇到的问题是 GCC 自己传递了一些默认标志,导致 GCC 然后输出错误:

/usr/local/arm/2.95.3/bin/arm-linux-gcc -specs=/home/feroze/wnr834m/marvell_WNR834M/gcc_specs -D__KERNEL__ -I/home/feroze/wnr834m/marvell_WNR834M/linux-88fxx81 -1_1_3_gtk/include -Wall -Wstrict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing -fno-common -DLED_DUAL_COLOR -DFOR_ROUTER -I/home/feroze/wnr834m/marvell_WNR834M/linux-88fxx81-1_1_3_gtk/arch/arm /mach-mv88fxx81/Soc/gpp/ -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -march=armv5 -mtune=arm9tdmi -mshort-load-bytes -msoft-float -Uarm -march=strongarm - DKBUILD_BASENAME=main -c -o init/main.o init/main.c cc1:-march= 开关的错误值(强臂) make[1]: *** [init/main.o] 错误 1 make[1]: 离开目录`/home/feroze/wnr834m/marvell_WNR834M/linux-88fxx81-1_1_3_gtk'

我检查了整个 makefile,找不到任何定义 LINUX_ARM_ARCH_5 和 -march=armv5 的地方。我在 makefile 中定义 -march=strongarm,但随后它被 ARMv5 定义附加。

所以,我从 gcc 创建了一个 defs 文件,将其修改为只有 ARMv4 的选项,然后通过指定 -specs= 选项来使用它。但是,这仍然不能解决问题。

有人可以帮忙吗?我该如何解决这个问题?

谢谢!

热血沸腾

【问题讨论】:

  • 这是一个基于 autotools 的项目吗? “./configure”进程将添加几个它认为是“暗示”或“必需”的标志。

标签: linux arm


【解决方案1】:

-march 标志在arch/ARM/Makefile 中设置,取决于您在配置文件中选择的机器。如果您不想要 armv5 标志,请务必在配置文件中选择正确的架构。

您应该假设内核附加的 CFLAGS 是正确的(前提是您的配置没问题),如果您的工具链不支持其中之一,那么您别无选择,只能使用 original crosstol script 自行交叉编译工具链应该适用于 2.95.3

编辑:原始答案
你想建立什么? 2.95.3 工具链相当古老。您应该尝试更新的工具链。你可以找到一个预编译的here 选择 EABI 开始。

这不是您问题的直接答案,但如果您正在构建 linux 内核,则不需要弄乱 Makefile。如果您可以获得更“标准”的工具链,您将获得更多帮助。

【讨论】:

  • 我使用 2.95.3 工具链的原因是因为我正在为一个相当老的路由器 - Netgear WNR834M 构建 linux 内核固件。我尝试使用更新的工具链构建该内核源代码,但出现了很多编译错误。
  • 忘了提到那个路由器的源代码中的linux内核版本是2.4(我认为)。
  • 我无法使用 CodeSourcery EABI 工具链对其进行编译。此外,2.95.3 版本的工具链不支持设备上的 armv5 处理器。因此,即使 2.95.3 编译成功,链接器也会失败,因为它找不到某些符号。我将尝试使用您建议的原始 crosstool 脚本。甚至 netgear OSS 支持人员都要求我去那里构建一个。
【解决方案2】:

这不会严格地帮助您消除这个问题,但是您可以使用gcc -dM -E <empty_file.c>gcc -dM -E -x c /dev/null 打印出所有预定义#defines 的gcc 列表。将 -dM 与另一个标志(如 -march)结合起来,您可能能够找到导致您的 #define 问题的原因。

【讨论】:

    【解决方案3】:

    一定要检查你的环境变量,因为它们可以说服 make 做意想不到的事情。

    如果 Makefile 包含另一个文件,它可能会在调用 CC 之前修改 CFLAGS。你能在CC调用之前打印CFLAGS的内容吗?

    【讨论】:

    • 环境变量中没有导致此问题的任何内容。我已经检查过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2011-01-12
    • 1970-01-01
    • 2011-10-19
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多