【发布时间】: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)