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