Добавить в корзинуПозвонить
Найти в Дзене
Old Programmer

Программирование на языке ассемблера в Linux 64. Компилирование с помощью программы gcc (книга)

Продолжаем публикацию книги о программирование на языке ассемблера (GAS) в операционной системе Linux (x86-64). Сегодня говорим о трансляции программ на языке ассемблера с использованием программы gcc Параграф 6.2 Компилирование с помощью программы gcc Сегодня рассматриваем интересный вопрос, имеющий отношение к трансляции программ на языке ассемблера. Конечно, мы уже останавливались на этом вопросе в самом начале нашей книги (см. Параграф 1.4). Но речь тогда шла только в объема, необходимом для обычной трансляции программ на языке ассемблера. Вернемся к этому вопросу. Пусть имеется элементарная программа на языке ассемблера (см. листинг 50) Для трансляции программы из листинга 60 выполняются хорошо знакомые нам команды as --64 l56.s -o l56.o
ld -s l56.o -o l56 В результате появляется исполняемый модуль l56, который может быть запущен на выполнение командой ./l56. Я не раз упоминал о метки _start. Она объявляется глобальной. Это важно для редактора связей ld. По умолчанию это имя д

Продолжаем публикацию книги о программирование на языке ассемблера (GAS) в операционной системе Linux (x86-64). Сегодня говорим о трансляции программ на языке ассемблера с использованием программы gcc

Список разделов канала Old Programmer, канала о программировании и программистах
Old Programmer27 мая 2021
Книга "Ассемблер для Linux"
Old Programmer4 июля 2021
Из записок старого программиста. Притчи о компьютерных жителях. Товарищ Комманд Ком, Диггер и отец Виндовс...
Old Programmer31 июля 2020

Параграф 6.2

Компилирование с помощью программы gcc

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

Пусть имеется элементарная программа на языке ассемблера (см. листинг 50)

Для трансляции программы из листинга 60 выполняются хорошо знакомые нам команды

as --64 l56.s -o l56.o
ld -s l56.o -o l56

В результате появляется исполняемый модуль l56, который может быть запущен на выполнение командой ./l56.

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

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

Перепишем программу из листинга 50 следующим образом (см. листинг 51)

Мы изменили имя метки, с которой начнет выполняться программа на main. Но при этом нам придется несколько изменить команды трансляции.

as --64 l57.s -ol57.o
ld -s -e main l57.o -ol57

Мы видим, что у компоновщика появился дополнительный ключ -e main, который указывает, что именно метке main должен быть присвоен адрес, с которого начнет выполняться программа.

Теперь перейдем к рассмотрению возможности другой технологии трансляции программ на языке ассемблера. В составе операционной системы Linux входит универсальный транслятор gcc. Расшифровка gcc — GNU Compiler Collection. В действительности за этой программой скрывается целый набор компиляторов, которые распознаются программой gcc по расширениям файлов. Лишний раз подчеркнем, что иногда встречается ошибочное утверждение, что gcc является компилятором для программ на языке C.

С другой стороны при компилировании программы на языке C с помощью gcc промежуточным результатом является модуль на языке ассемблера. Мы можем получить его указав для gcc ключ -S. Например, gcc -S prog.c и у вас в каталоге появится файл prog.s на языке ассемблера. Как известно, программа на языке ассемблера должна содержать функцию с именем main. Именно main и является, в конечном итоге, той меткой, с которой должна запускаться программа. При этом при трансляции к программе присоединяются стандартные модули для языка C. В результате получается исполняемый модуль с адресом запуска, отличным от адреса, который получает метка main. Запускается в начале некая стандартная функция и только потом происходит вызов по адресу, соответствующий метке main.

При трансляции с помощью gcc программы, написанной на языке ассемблера, происходит по сути выполнение второй половины трансляции с языка C. Другими словами, чтобы провести трансляцию с языка ассемблера с помощью gcc программа должна содержать модуль с глобальной меткой main. При этом автоматически подключаются стандартные C модули, как если бы программа изначально была написана на языке C.

Программа из листинга 51 может быть скомпилирована командой

gcc l57.s -o l57

Возможно также такой вариант

as --64 l57.s -o l57.o
gcc l57.o -o l57

Соответственно можно создавать программу, состоящую из нескольких модулей (раздельная компиляция).

Использование программы gcc для компиляции программ на языке ассемблера открывает очень простой доступ к интеграции языка ассемблера с языком C, со стандартной библиотекой языка C. Этим вопросам будут посвящены последующие параграфы данной главы.

В параграфе 4.8 был рассмотрен очень интересный вопрос получения параметров из командной строки. При использовании для трансляции gcc мы будем иметь несколько иную картину. Поскольку в начале запускается некая стандартная процедура для языка C, то последующий запуск функции main осуществляется уже по канонам запуска функции в системах Linux x86-64. В следующем параграфе мы подробнее остановимся на этом вопросе.

На сегодня все. Подписываемся на мой канал Old Programmer и ставьте "лайки". А я продолжаю заниматься книгой Ассемблер для Linux 64.

Список разделов канала Old Programmer, канала о программировании и программистах
Old Programmer27 мая 2021

<--Глава 6. Параграф 6.1 --> Глава 6. Параграф 6.3

Программа l57.s
Программа l57.s

#программирование #программисты #ассемблер #assembler #языки программирования