更多GCC链接时间问题:对main的未定义引用

时间:2010-04-19 16:24:33

标签: c gcc makefile linker options

我正在为Cortex-A8处理器编写软件,我必须编写一些ARM汇编代码来访问特定的寄存器。我正在使用gnu编译器和相关工具链,这些工具安装在带有Ubuntu的处理器板(Freescale i.MX515)上。我使用WinSCP和PuTTY终端从我的主机PC(Windows)建立连接。

像往常一样,我开始使用一个简单的C项目 main.c functions.s 。我使用 GCC 汇总使用 as link <编译 main.c / strong>生成的目标文件再次使用 GCC ,但在此过程中我遇到了奇怪的错误。

重要发现 -

与此同时,我发现我的汇编代码可能存在一些问题,因为当我使用命令as -o functions.o functions.s单独汇编它并尝试使用{{1}运行生成的 functions.o 时}命令,bash shell无法将此文件识别为可执行文件(按下选项卡上的函数.o未被选中/ PuTTY未突出显示该文件)。

有谁能说明这里发生了什么?在链接过程中,是否有任何特定选项需要发送给GCC ?我看到的错误很奇怪而且超出了我的理解,我不明白GCC所指的是什么。

我在这里粘贴了main.c,functions.s,Makefile和错误列表的内容。

请帮助!!!

makfile根据人们的建议进行编辑后包含最新错误 -

./functions.o

的main.c

ubuntu@ubuntu-desktop:~/Documents/Project/Others/helloworld$ make
gcc -c -mcpu=cortex-a8 main.c
as -mcpu=cortex-a8 -o functions.o functions.s
gcc -o hello main.o functions.o
functions.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o:init.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [hello] Error 1

functions.s

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
    return EXIT_SUCCESS;
}

生成文件

* Main program */
    .equ      STACK_TOP, 0x20000800
    .text
    .global _start
    .syntax unified

_start:
    .word STACK_TOP, start
    .type start, function

start:
    movs  r0, #10
    movs  r1, #0
    .end

- hello被包含在这里后,由stackoverflow的人在这里提出,但问题仍然存在,我仍然得到相同的错误。

all: hello

hello: main.o functions.o
    gcc hello -o main.o functions.o

错误

main.o: main.c
    gcc -c -mcpu=cortex-a8 main.c

functions.o: functions.s
    as -mcpu=cortex-a8 -o functions.o functions.s

4 个答案:

答案 0 :(得分:7)

在makefile中:

hello: main.o functions.o
    gcc -o main.o functions.o

应该是:

hello: main.o functions.o
    gcc -o hello main.o functions.o

目前,您正在链接functions.o,但不是main.o,并生成一个名为main.o的输出可执行文件,它会覆盖您现有的main.o.

答案 1 :(得分:2)

不应该

hello: main.o functions.o
    gcc -o main.o functions.o

hello: main.o functions.o
    gcc -o hello main.o functions.o

答案 2 :(得分:2)

正如Bigbohne所说,gcc正试图在标准运行时库中进行链接。尝试将-nostdlib选项添加到gcc调用中:

gcc -nostdlib -o hello main.o functions.o

答案 3 :(得分:0)

我认为这与gcc最终链接的运行时库有关。

这个库中已经存在“_start”。

我认为你必须在没有“std library”的情况下进行编译。但是你没有printf,getchar和所有其他有用的东西。