Больше GCC связывает проблемы времени: неопределенная ссылка на основное

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

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

Важное открытие -

Между тем я узнал, что мой ассемблерный код может иметь некоторые проблемы потому что, когда я индивидуально собираю его с помощью команды as -o functions.o functions.s и попытайтесь выполнить сгенерированное использование functions.o ./functions.o команда, оболочке удара не удается распознать этот файл как исполняемый файл (на нажимающей вкладке functions.o, не добирается, ВЫБИРАЛ/ШПАКЛЕВАЛ, не выделяет файл).

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

Я вставляю здесь содержание main.c, functions.s, Make-файла и списка ошибок.

Справка!!!

Последние ошибки, включенные после 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;
}

functions.s

* 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

Make-файл

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
5
задан HaggarTheHorrible 26 April 2012 в 05:20
поделиться

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.

8
ответ дан 13 December 2019 в 05:32
поделиться

Не должно

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

быть

hello: main.o functions.o
    gcc -o hello main.o functions.o
2
ответ дан 13 December 2019 в 05:32
поделиться

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

gcc -nostdlib -o hello main.o functions.o
2
ответ дан 13 December 2019 в 05:32
поделиться

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

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

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

0
ответ дан 13 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: