【问题标题】:Cross compiling GCC with newlib for ARM: how to specify GCC options like -march?使用 ARM 的 newlib 交叉编译 GCC:如何指定 GCC 选项,如 -march?
【发布时间】:2012-06-04 07:37:29
【问题描述】:

我已经在 Mac OS X 上为 ARM 目标编译了 GCC 和 newlib。但是,libc.a 是使用 -fshort-enums 编译的,我不希望这样,因为当我为 ARM 编译东西时,我使用 -fno-short-enums。当然,这会发生冲突:

ld: warning: /var/folders/9m/2wnjp9zd71x13cpdpf16y_4r0000gn/T//ccQuEnp6.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail

每次我尝试运行“Hello, World!”时可执行文件,它有段错误。会不会是这个原因?

这是我用来编译 hello.c 的命令:

arm-eabi-gcc \
hello.c -o hello \
/Users/user/gcc-arm-install/arm-eabi/lib/crt0.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtbegin.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crti.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtn.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtend.o \
-v -nostdinc -nostdlib -static \
-march=armv7-a -mno-thumb-interwork -marm -mfpu=neon -mfloat-abi=softfp -fpic \
-ffunction-sections -fno-short-enums -fno-rtti -fno-exceptions \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include-fixed \
-I/Users/user/gcc-arm-install/arm-eabi/include \
-I/Users/user/gcc-arm-install/arm-eabi/sys-include \
-L/Users/user/gcc-arm-install/arm-eabi/lib \
-L/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0 \
-lm -lc -lgcc

更新:

好的,我想我已经将问题缩小到 newlib 的 libc 和启动文件 (crt0.o) 的组合。我尝试使用 libc.a 和 Android NDK 中的启动文件使用 GCC 4.7.0 编译测试应用程序,并且在静态编译时可以在手机上运行。事实上,即使 ld 再次抱怨 libgcc 使用“可变大小的枚举”(即没有像其他所有内容一样使用 -fno-short-enums 编译),它仍然有效。所以,我关于 -fno-short-enums 是我早期崩溃二进制文件的罪魁祸首的假设是不正确的。

这是有效的:

为目标“arm-linux-eabi”从源代码编译的 Binutils 和 GCC 4.7.0。我使用 --with-newlib (GCC 的源代码树中的 newlib 和 libgloss)配置了 GCC。因此,GCC 实际上是用 newlib 构建的,并与 newlib 一起安装,只要我实际上不与 newlib 的 libc 链接,它就会生成工作二进制文件。目前,我必须使用 Andoid NDK 中的 libc 及其启动文件。

我的编译脚本看起来像这样。包含和库路径指向 NDK 包含和 libc:

NDK_PATH="/Users/user/SOURCE/android-ndk-r8/platforms/android-9/arch-arm"
CFLAGS="-nostdinc -nostdlib -static -fno-short-enums -lc -lgcc -lc"

gcc $NDK_PATH/usr/lib/crtbegin_static.o \
hello.c -o hello $CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o

我仍然希望使用 newlib 的 libc 工作来静态编译二进制文件。回到 shell 脚本...

【问题讨论】:

  • 很难回答但听起来很容易测试;用-fshort-enums 编译 hello.c 是否可以修复崩溃不是很容易测试吗?
  • 有没有考虑下载the source for libc.a自己编译?
  • -fshort-enums 抑制警告,但我仍然遇到崩溃:-(
  • 我将尝试再次编译 newlib/libc,但我希望能够像最初那样使用这些选项一步编译 GCC 和 newlib。
  • 我知道这听起来很愚蠢,但是您是否尝试通过从相关的段错误位置进行反汇编来获取回溯?有时,查看问题而不是尝试猜测会有所帮助。 (见debuggingrules.com

标签: android c macos gcc arm


【解决方案1】:

为了工作,我为 Cortex-M3 平台进行了交叉构建,并且还使用了 newlib。以下链接可能对您有所帮助:

http://frank.harvard.edu/~coldwell/toolchain/ http://www.microbuilder.eu/Tutorials/SoftwareDevelopment/BuildingGCCToolchain.aspx

虽然以下链接是特定于 Cortex-M3 的,但它可能会为您提供一些见解,我用它来编写我的工具链构建脚本: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

您的 newlib 可能被错误编译(可能与主机编译器有关?因为它链接了,所以不太可能,但嘿,有可能)。

【讨论】:

    【解决方案2】:

    我认为你可以先编写一个 shell 脚本来选择工作环境,就像你将在 gcc 或 arm-gcc 下工作一样。在这个脚本中,你可以为你想要的不同的lib创建一个替代的lib链接,比如如果你登录并选择gcc,lib文件将是普通的libc,如果你选择arm-gcc,lib将是不同的

    【讨论】:

      猜你喜欢
      • 2019-03-02
      • 2014-10-06
      • 2016-12-26
      • 2016-02-05
      • 2014-11-14
      • 1970-01-01
      • 2019-06-19
      • 2011-08-20
      相关资源
      最近更新 更多