2012-03-22 4 views
3

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

Я пишу базовую программу сборки, чтобы начать и сразу же прекратить использование прерывания ядра в 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 

Пришло Bizzare, даже комментируя все Неподвижные результаты в Illegal instruction, несмотря на отсутствие инструкций. Я пропустил шаг linking, несмотря на отсутствие других файлов для ссылки? Да я

EDIT: Позвольте мне перефразировать мой вопрос, зачем вам нужно связать, когда нет библиотеки или что-нибудь связать?

ответ

3

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

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

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

Why do you need to link when there is no library or anything to link to?

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

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

"as" is primarily intended to assemble the output of the GNU C compiler "gcc" for use by the linker "ld"

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

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

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

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

+0

какая разница, если это всего лишь объектный файл? – Hawken

+0

@Hawken, вы не можете _run_ объектного файла больше, чем вы можете запустить или связать исходный файл или скомпилировать индекс базы данных :-) Объектный файл имеет форму, которая готова к подключению к исполняемому файлу, но сама не является исполняемый файл. – paxdiablo

+0

Так что же таинственный код, добавленный компоновщиком? Я вижу почти двойной размер файла в 'hexdump'. Первые двенадцать байтов идентичны. – Hawken

1

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

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

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

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

+0

из того, что я понимаю, нормальные программы на C используют стандартную библиотеку, даже если вы говорите не так, следовательно, почему C к сборке не включает прерывание ядра и вместо этого возвращает подпрограмму _main, которая была вызвана какой-то загадочной частью кода, с которой она связана , – Hawken

+0

Зависит от вашего определения «обычных программ на C». Позвольте мне сказать, что точно так же, как эта программа ASM, вы можете написать код C, который не использует библиотеки, и ничего, кроме скомпилированной версии вашего кода C, попадает в связанный двоичный файл. main() даже не требуется (некоторый вкус _start для инструментов gnu). большинство программ на C, почти все, конечно, собираются сделать что-то интересное/полезное и нуждаются в библиотеке C или хотят работать в операционной системе и нуждаются в каком-то стартовом коде перед main() или в длинном списке других причин, чтобы иметь элементы связанный в. –