Взаимодействие с GLIBC
- Автор: lonesome TSH/Digital Daemons
- Дата: .01.2003
- Раздел: Низкоуровневое программирование в Linux, http://www.lowlevel.ru
GLIBC стандартная библиотека Си от GNU. Если вы программируете на ассемблере под Linux, то использование функций из этой библиотеки - хороший способ сократить размер программы и затраченные усилия. Безусловно, использование их замедляет программу, но это всего лишь значит, что их не стоит использовать в критических участках - циклах. Если же вы используете GLIBC скажем для форматированного вывода на консоль, то вряд ли вы заметите какое-нибудь замедление.
Более того использование GLIBC в большинстве случаев сделает вашу программу легко портируемой на многие другие UNIX-платформы.
В качестве примера рассмотрим программу, которая импортирует функцию puts (вывод на консоль null-terminated строки)
;Точка входа "_start" на самом деле находится
;в подключаемом *.o файле стандартной библиотеки Си
;Она передает управление на функцию "main",
;которая должна находиться в нашей программе
global main
;Внешние функции
extern exit
extern puts
;Сегмент кода:
section .text
;Функция main:
main:
;Параметры передаются в стеке:
push dword msg
call puts
;По конвенции Си вызывающая процедура должна
;очищать стек от параметров самостоятельно:
sub esp, 4
;Завершение программы с кодом выхода 0:
push dword 0
call exit
ret
;Сегмент данных
section .data
msg: db "An example of interfacing with GLIBC.",0x0D,0
Компиляция:
Компоновка:
Для вызова компоновщика с нужными параметрами мы не будем заморачиваться с командой ld, а воспользуемся GCC, который сам определит, что нужно нашему объектному файлу: