为什么gcc在链接时会抱怨,但ld却没有?

时间:2016-05-31 01:28:04

标签: gcc assembly arm ld

ARM汇编程序示例文件:

    .global _start
_start: 
    mov r0, #0x1

    mov r7, #1
    swi 0

可以使用

组装文件
as -o example.o example.s
gcc -c -o example.o example.s

目标文件可以与ld

链接
ld -o example example.o

但是

gcc -o example example.o

抱怨以下

example.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/crt1.o:/build/glibc-6f8a9a/glibc-2.19/csu/../ports/sysdeps/arm/start.S:79: first defined here
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/crt1.o: In function `_start':
/build/glibc-6f8a9a/glibc-2.19/csu/../ports/sysdeps/arm/start.S:119: undefined reference to `main'

背景资料: 我试图从'ARM汇编语言,William Hohl'学习ARM汇编。我有第一版使用ARMv4T。我在Raspberry Pi 1(ARMv6)上运行代码。所以,我正在拼凑来自全国各地的信息尝试让这些例子运行。这个让我感到难过。一般来说,任何指针都非常受欢迎。谢谢

1 个答案:

答案 0 :(得分:0)

Machael Petch的评论是正确的。使用全局调用main会导致C运行时用于处理程序启动和完成。

  

我们作弊只是为了让事情变得更容易一些。我们写了一个C main   汇编程序中的函数只返回2;这样我们的方案   由于C运行时处理初始化和终止,因此更容易   我们的计划。   ...   这是必需的,因为C运行时将调用main。如果不是   全局,它不会被C运行时和链接阶段调用   会失败。

http://thinkingeek.com/2013/01/09/arm-assembler-raspberry-pi-chapter-1/