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

时间:2012-03-09 10:34:07

标签: c arm

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

int main(void)
{
    return(0);
}

输入命令arm-none-eabi-gcc main.c时收到错误消息

  

C:/ yagarto / bin中/../ LIB / GCC /臂-NONE-EABI / 4.6.2 /../../../../臂-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: undefined reference to _退出'collect2:ld返回1退出状态

我做错了什么?

2 个答案:

答案 0 :(得分:6)

Newlib要求您定义_exit符号。为了使newlib工作,您可能还需要提供其他符号:http://sourceware.org/newlib/libc.html#Stubs

这样的事情应该足够了(假设你正在为微控制器编译,当你有操作系统时不要这样做):

.globl _exit
_exit:
    b     . // Loop until reset

或者在C:

void _exit(void) {
    while(1) {
        // Loop until reset
    }
}

BTW:你可能想在旋转前禁用中断。

编辑:也许有点额外的信息。 Yagarto包含Newlib作为libc,它是一个提供printf()malloc()等功能的库。但是,它无法知道如何将字符发送到屏幕或控制台(如果是printf),或者如果您致电abort()exit(),如何退出。因此,Newlib要求您提供一些基本功能的实现,具体取决于您使用的Newlib的功能。

答案 1 :(得分:0)

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

也就是说,CodeSourcery(现在的Mentor)做了一个不错的交钥匙交叉编译环境---它只是为你的平台编译的gcc和glibc,但如果你想轻松设置它仍然是一个好的起点:< / p>

http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/

不幸的是,当Mentor购买CodeSourcery时,他们的下载程序比过去更加困难,现在你必须通过电子邮件注册并获得一个链接,而不仅仅是下载,但我还没有找到获得gcc工具链的方法不那么糟糕。 (建议要......)