Другие проблемы со временем ссылки GCC: неопределенная ссылка на main

Я пишу программное обеспечение для процессора Cortex-A8, и мне нужно написать код сборки ARM для доступа к определенным регистрам. Я использую компиляторы gnu и связанные цепочки инструментов, эти инструменты установлены на плате процессора (Freescale i.MX515) с Ubuntu. Я подключаюсь к нему со своего хост-компьютера (Windows) с помощью WinSCP и терминала PuTTY.

Как обычно, я начал с простого проекта на C, содержащего main.c и functions.s. Я компилирую main.c, используя GCC, собираю функции, используя as и link< /strong> сгенерированные объектные файлы, используя еще раз GCC, но во время этого процесса я получаю странные ошибки.

Важный вывод —

Тем временем я обнаружил, что мой ассемблерный код может иметь некоторые проблемы, потому что, когда я собираю его по отдельности с помощью команды as -o functions.o functions.s и пытаюсь запустить сгенерированный functions.o с помощью команды ./functions.o, оболочка bash не распознает это файл как исполняемый файл (при нажатии вкладки functions.o не выбирается/PuTTY не выделяет файл).

Кто-нибудь может подсказать, что здесь происходит? Есть ли какие-либо конкретные параметры, которые я должен отправить в GCC в процессе связывания? Ошибки, которые я вижу, странны и находятся за пределами моего понимания, я не понимаю, о чем говорит GCC.

Я вставляю сюда содержимое main.c, functions.s, Makefile и список ошибок.

Помогите, пожалуйста!!!

Последние ошибки, добавленные после того, как makfile был отредактирован, как предложили ребята здесь -

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

main.c

#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

Создать файл

all: hello

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

-- привет был включен сюда после того, как его предложили ребята из stackoverflow, но проблема все еще сохраняется, я все еще получаю те же ошибки.

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

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

Ошибки

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 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
/usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o: In function `_start':
init.c:(.text+0x30): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [hello] Error 1

person HaggarTheHorrible    schedule 19.04.2010    source источник
comment
Журнал сборки предполагает, что вы ориентируетесь на Linux. Это сделано намеренно или вы намеревались использовать «голое железо»? Похоже, что он нацелен на Linux, init.o неявно связан и уже содержит символ _start. Однако это, вероятно, другая проблема с отсутствующим main().   -  person Clifford    schedule 19.04.2010
comment
Clifford Я внес изменения в make-файл, но получил ошибки относительно инициализации, я не знаю, как это сделать. :( Я запустил очень большое приложение на этой плате без каких-либо проблем, эта проблема началась, когда я включил код сборки.   -  person HaggarTheHorrible    schedule 19.04.2010


Ответы (4)


В make-файле:

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.

person Community    schedule 19.04.2010
comment
Привет, Нил, я внес изменение, но все еще вижу похожие ошибки, я вставляю их ниже — 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: в функции _start': (.text+0x0): multiple definition of _start' /usr/lib/gcc/arm-linux-gnueabi/4.3.3/ ../../../crt1.o:init.c:(.text+0x0): сначала определено здесь collect2: ld вернуло 1 статус выхода make: *** [hello] Ошибка 1 - person HaggarTheHorrible; 19.04.2010
comment
@vikram Отредактируйте новую информацию в своем вопросе. Мне кажется, что библиотека RT также определяет _start. - person ; 19.04.2010
comment
Нил, я включил новый список ошибок, инициализация каким-то образом вызывается, я не знаю, как. - person HaggarTheHorrible; 19.04.2010

Не должен

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

be

hello: main.o functions.o
    gcc -o hello main.o functions.o
person codaddict    schedule 19.04.2010

Как предполагает Bigbohne, gcc пытается скомпоновать стандартную библиотеку времени выполнения. Попробуйте добавить параметр -nostdlib к вашему вызову gcc:

gcc -nostdlib -o hello main.o functions.o
person tikiboy    schedule 19.04.2010

Я думаю, что это как-то связано с библиотекой времени выполнения, на которую gcc ссылается в конце.

А в этой библиотеке уже есть "_start".

Я думаю, вам нужно скомпилировать без «std library». но тогда у вас не будет printf, getchar и всех других полезных вещей.

person Bigbohne    schedule 19.04.2010
comment
Bigbonhne, я закомментировал stdio.h и stdlib.h, но никаких изменений, я снова получаю жалобы на несколько определений в _start. - person HaggarTheHorrible; 19.04.2010