为ARM处理器编译基本C文件

为ARM处理器编译基本C文件,c,arm,C,Arm,我正在使用GCC工具链的Yagarto重新编译。我试图编译这个简单的程序,以获得一个.elf可执行文件: int main(void) { return(0); } 键入命令arm none eabi gcc main.c时,我会收到错误消息 c:/yagarto/bin/./lib/gcc/arm none-eabi/4.6.2/../../../../../../../arm none-eabi/lib\libc.a(lib_a-exit.o): 在函数exit'中: C:\msy

我正在使用GCC工具链的Yagarto重新编译。我试图编译这个简单的程序,以获得一个
.elf
可执行文件:

int main(void)
{
    return(0);
}
键入命令
arm none eabi gcc main.c
时,我会收到错误消息

c:/yagarto/bin/./lib/gcc/arm none-eabi/4.6.2/../../../../../../../arm none-eabi/lib\libc.a(lib_a-exit.o): 在函数
exit'中:
C:\msys\1.0\home\yagarto\newlib build\arm none eabi\newlib\libc\stdlib/../../../../../../../../../../../newlib-1.19.0/newlib/libc/stdlib/exit.C:65:
未定义对
\u exit'collect2的引用:ld返回1退出状态


我做错了什么?

这在很大程度上取决于您运行的平台、编译的平台、使用的工具链等。没有一个简单的答案

也就是说,CodeSourcery(现在的Mentor)提供了一个不错的交钥匙交叉编译环境——它只是为您的平台编译的gcc和glibc,但如果您想轻松设置,它仍然是一个很好的起点:


不幸的是,当Mentor购买CodeSourcery时,他们使下载过程比以前更加困难,现在你必须注册并获得通过电子邮件发送给你的链接,而不仅仅是下载一些东西,但我还没有找到一种不那么糟糕的方法来获得gcc工具链。(需要建议…

Newlib要求您定义退出符号。为了使newlib正常工作,您可能还需要提供其他符号:

这样做就足够了(假设您是为微控制器编译的,当您有操作系统时不要这样做):

或在C中:

void _exit(void) {
    while(1) {
        // Loop until reset
    }
}
顺便说一句:您可能希望在旋转之前禁用中断


编辑:可能需要一些额外的信息。Yagarto将Newlib包含为libc,libc是一个提供函数的库,如
printf()
malloc()
,等等。但是,它不知道如何将字符发送到屏幕或控制台(在printf的情况下),或者在调用
abort()
exit()
的情况下如何退出。因此,Newlib要求您提供一些基本功能的实现,具体取决于您使用的Newlib的功能。

您的构建环境中有可用的ARM标准C库吗?因为你的链接器说“不”,我好像没有。如何在构建环境中获得ARM标准C库?工具链本身始终包含最常用的库。您可能没有正确配置库路径,或者可能需要显式链接库。顺便说一句,
return
不起作用,您可以编写
return 0
void _exit(void) {
    while(1) {
        // Loop until reset
    }
}