Syn*_*tix 31 c macos android gcc arm
我在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
Run Code Online (Sandbox Code Playgroud)
每当我尝试运行"你好,世界!" 可执行文件,它是段错误的.这可能是原因吗?
这是我用来编译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
Run Code Online (Sandbox Code Playgroud)
更新:
好吧,我想我已经将问题缩小到newlib的libc和启动文件(crt0.o)的组合.我尝试使用libc.a和来自Android NDK的启动文件使用GCC 4.7.0编译测试应用程序,并且在编译静态时在手机上工作.事实上,即使ld再次抱怨使用"可变大小的枚举"(即,不使用-fno-short-enums编译其他所有内容),它仍然有效.所以,我关于-fno-short-enums是我之前崩溃的二进制文件的罪魁祸首的假设是不正确的.
这是什么工作:
Binutils和GCC 4.7.0从目标"arm-linux-eabi"的源代码编译而来.我使用--with-newlib(GCC的源代码树中的newlib和libgloss)配置了GCC.因此,GCC实际上是使用newlib构建的,并与newlib一起安装,只要我实际上没有与newlib的libc链接,它就会生成工作二进制文件.目前,我必须使用Andoid NDK中的libc及其启动文件.
我的编译脚本看起来像这样.include和library路径指向NDK include和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
Run Code Online (Sandbox Code Playgroud)
我仍然希望使用newlib的libc工作来静态编译二进制文件.回到shell脚本......
在工作中,我针对 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 可能被错误编译了(也许是主机编译器?不太可能,因为它链接了,但是嘿这是可能的)。
| 归档时间: |
|
| 查看次数: |
8500 次 |
| 最近记录: |