Пошаговая компиляция C с использованием GCC? - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь сделать четыре шага, которые необходимо выполнить для преобразования из источника C в исполняемый файл с GCC. Первые 3 шага работают как положено, но последний доставляет мне проблемы. У меня есть два файла: writeByte.h и writeByte.c, которые содержат следующее:

// writeByte.h
// USED GCC COMMANDS BY ORDER:
// 1 - "gcc writeByte.c -o pre-processed.i -E"
// 2 - "gcc pre-processed.i -o assembled.s -S"
// 3 - "gcc assembled.s -o compiled.o -c"
// 4 - ???

void writeByte(char* addr, char val);

и

// writeByte.c
#include "writeByte.h"
void writeByte(char* addr, char val) { *addr = val; }

Предположительно, чтобы связать файл, я должен выполнить gcc compiled.o -o executable, но он говорит, что на .text+0x20 ссылка на main не определена, поэтому я не знаю, как следовать.

1 Ответ

0 голосов
/ 05 июля 2018

TL; DR: определите функцию main(), и ваша программа будет работать.

Из спецификации C C11 (ISO / IEC 9899: 201x / N1548)

5.1.2 Среды исполнения

Определены две среды выполнения: автономные и hosted . [...]

5.1.2.1 Отдельно стоящее окружение

В автономной среде (в которой выполнение программы на С может осуществляться без какой-либо выгоды от операционной системы), имя и тип функции, вызываемой при запуске программы, определяются реализацией. [...]

5.1.2.2 Размещенная среда

[...]

5.1.2.2.1 Запуск программы

Функция, вызываемая при запуске программы, называется main. [...]

* * +1032 Кроме того: * 1 033 *

J2 Неопределенное поведение

Поведение не определено в следующих обстоятельствах:

  • [...]
  • Программа в размещенной среде не определяет функцию с именем main, используя одну из указанных форм (5.1.2.2.1).

размещенная среда

Скорее всего, это ваш случай. Это относится к типичным операционным системам, таким как Linux, Unix, Mac OS X, Windows, Amiga OS и многим другим. В этом случае вашей средой обычно является размещенная среда.

Если вы запустите свой компилятор C и компоновщик без каких-либо опций, которые будут выбирать или влиять на среду, и если целью является такая типичная операционная система, и вы, наконец, сделаете ссылку, допущение, сделанное компилятором C и компоновщиком, будет размещенная среда. Как описано выше, это означает, что вам нужно предоставить функцию main(), чтобы размещенная среда знала, где запустить вашу C-программу. Поскольку вы не предоставили функцию main, применимо условие J2 Неопределенное поведение , и компоновщик отказался завершить свою работу.

Примечание. Эти операционные системы на самом деле предоставляют собственный настраиваемый интерфейс, см. Ниже.

Решение: Обеспечить функцию main().

Отдельно стоящая среда

Отдельно стоящие среды обычно возникают при самостоятельной разработке прошивки или операционной системы. В этом случае точка входа определяется процессором. Большинство процессоров начнут выполнение по заранее заданному адресу или по конфигурируемому адресу, считанному из таблицы векторов, указанной по заранее определенному адресу.

Пользовательские среды

Кроме того, существуют пользовательские среды. Две наиболее распространенные пользовательские среды:

Типичная ОС

Чтобы иметь возможность делать больше, чем указано в спецификации C, операционные системы определяют свою собственную среду. Эта среда обычно является расширением размещенной среды и использует точку входа, указанную компоновщиком. Как правило, эта точка входа на самом деле является другой функцией, часто называемой _start, которая предоставляется библиотекой по умолчанию, такой как libglibc. Эта функция _start вызывается ОС, и эта функция _start затем вызывает main.

Таким образом, вместо предоставления main можно было бы предоставить _start или эквивалент, вместо этого. Вы можете написать свою собственную _start функцию или точку входа. Однако это рискует тем, что ваша программа будет излишне менее переносимой, и вам придется решать проблемы операционной системы, которые скрытая от вас скрытая среда. Поэтому не рекомендуется для «обычных» программ «нормальными» разработчиками.

DLL-окружения

Когда программы должны запускаться как плагины для других программ, эти другие программы определяют пользовательскую среду. Как правило, эта пользовательская среда реализуется как DLL (Dynamic Link Library).

Встроенные среды

ДляВ некоторых встроенных системах наборы инструментов (компилятор и т. д.) поставляются с библиотеками, которые предоставляют настраиваемую среду для этой системы. Эти среды имеют функции, которые находятся где-то между автономной средой и размещенной средой, а точки входа зависят от соответствующей цепочки инструментов. Чтобы избежать путаницы, связанной с неожиданными именами точек входа, в цепочках инструментов обычно используются main, start, _start, Start или _Start в качестве имен для точки входа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...