31

我已经在 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 脚本...

4

2 回答 2

2

对于工作,我为 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 可能已被错误编译(可能与主机编译器有关?因为它链接,所以不太可能,但嘿,这是可能的)。

于 2012-08-12T01:42:02.093 回答
1

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

于 2012-08-16T07:03:18.550 回答