Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: HaggarTheHorribleОтветов: 4

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

Как обычно, я начал с простого проекта на C, содержащего main.c и functions.s. Я компилирую main.c, используя GCC, собираю функции, используя as и link сгенерированные объектные файлы, используя еще раз 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
  • Журнал сборки предполагает, что вы ориентируетесь на Linux. Это сделано намеренно или вы намеревались использовать "голое железо"? Похоже, что он нацелен на Linux, init.o неявно связан и уже содержит символ _start. Однако это, вероятно, другая проблема с отсутствующим main(). Clifford 19.04.2010
  • Clifford Я внес изменения в make-файл, но получил ошибки относительно инициализации, я не знаю, как это сделать. :( Я запустил очень большое приложение на этой плате без каких-либо проблем, эта проблема началась, когда я включил код сборки. HaggarTheHorrible 19.04.2010

gcccoptionslinkermakefile

Ответы

Ответ 1 · рейтинг 8 · Community

В 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.

Ответ 2 · рейтинг 2 · codaddict

Не должен

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

be

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

Ответ 3 · рейтинг 2 · tikiboy

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

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

Ответ 4 · Bigbohne

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы