Rambler's
Top100

Взаимодействие с GLIBC

Автор: lonesome TSH/Digital Daemons
Дата: .01.2003
Раздел: Низкоуровневое программирование в Linux

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

Компиляция:
nasm -felf inglibc.asm
Компоновка:
Для вызова компоновщика с нужными параметрами мы не будем заморачиваться с командой ld, а воспользуемся GCC, который сам определит, что нужно нашему объектному файлу:
gcc inglibc.o -o inglibc

Rambler's Top100