«Нелегальное обучение» основной программе сборки - даже не здравствуй, мир - зачем нужна связь? - PullRequest
3 голосов
/ 22 марта 2012

Я только что понял это, но вместо того, чтобы разбить мой новый вопрос («почему?») На другой вопрос, я думаю, что лучше всего, если решение этой проблемы и объяснение должны быть сохранены на той же странице.

Я пишу основную программу ассемблера, чтобы просто запустить ее и сразу же выйти с использованием прерывания ядра на int 0x80.Мой текущий код выглядит следующим образом:

/* Simple exit via kern-interrupt */

.globl start

start:
    pushl $0x0
    movl $0x1, %eax
    subl $4, %esp
    int $0x80

собран с

as -arch i386 <file>.s

при выполнении я получаю ошибку в одну строку:

Illegal instruction

Это странно,даже комментирование все равно приводит к Illegal instruction, несмотря на то, что нет никаких инструкций вообще.Я пропускаю шаг linking, несмотря на то, что нет других файлов для ссылки? Да, я

РЕДАКТИРОВАТЬ: Позвольте мне перефразировать мой вопрос, зачем вам ссылки, когда нет библиотеки или что-то, на что можно ссылаться?

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Вам нужно необходимо связать его, чтобы создать исполняемый файл. По умолчанию as просто предоставляет вам объектный файл, который можно связать с исполняемым файлом (либо с другими объектными файлами, либо самостоятельно), но сам по себе он не является допустимым исполняемым файлом. Попробуйте:

as -arch i386 -o file.o file.s
ld -o file file.o

В ответ на ваш вопрос:

Зачем вам ссылаться, когда нет библиотеки или чего-либо, на что можно ссылаться?

Поскольку ассемблер не знает , что вы не собираетесь связываться с чем-то другим.

В отличие от компилятора gcc, где предполагается, что вам нужна программа, если не указано иное (с параметром -c), as по умолчанию предоставляет вам объектный файл. С справочной страницы:

"as" в первую очередь предназначен для сборки выходных данных компилятора GNU C "gcc" для использования компоновщиком "ld"

Если вам нужна одношаговая команда, вы можете создать скрипт, например asld:

as -arch i386 -o $1.o $1.s
ld -o $1 $1.o

, а затем просто используйте asld file.

Или вы можете создать make-файлы, чтобы выполнять всю тяжелую работу за вас.

1 голос
/ 22 марта 2012

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

Потому что именно так была разработана цепочка инструментов. Один набор инструментов переносит вас из исходного кода (любого / многих языков) в объектные файлы, которые в большинстве случаев являются неполными. Этап связывания, даже если, как показывает paxdiablo, берет только ваш объектный файл и делает его исполняемым, требуется. Если вам больше не нужен ваш .text-адрес (обычно), и это происходит на этапе компоновщика.

Имеет большой смысл делать это таким образом, стадия связывания достаточно сложна, как таковая, сделать один инструмент, который выполняет эту работу и хорош в этой работе. Занимайтесь системной инженерией и определяйте интерфейс к этому инструменту. У языковых инструментов есть сложная задача, и они просто выполняют эту работу, выводя их как объектный файл, который они могут разрешить без необходимости становиться компоновщиком.

Если вы не хотите использовать этот набор инструментов и, возможно, использовать nasm или что-то в этом роде, вы можете перейти непосредственно от сборки к двоичному файлу за один шаг командной строки.

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