Создание разделяемых объектов (shared objects) в Linux
Разделяемые объекты (shared objects) в Linux являются аналогами .DLL в Windows. Находятся они обычно в /usr/lib и имеют расширение .so. Что они из себя представляют? Это исполняемые файлы формата ELF, которые экспортируют некоторые функции.
В качестве примера создадим библиотеку chomp.so, которая будет экспортировать функцию chomp (отрезание последнего символа строки, если это символ новой строки '\n')
;Экспортирование функцию chomp:
global chomp
;Объявление функции chomp:
chomp:
;В качестве параметра функция берет строку
;(точнее указатель на нее)
;Первые четыре байта - адрес возврата,
;значит нам нужны вторые четыре байта
mov eax, [esp+4]
;Теперь в EAX адрес строки
xor ecx, ecx
;Цикл - поиск нулевого символа (конца строки):
.loop
mov dl, [eax+ecx] ;Символ - в DL
inc ecx ;Увеличим счетчик цикла
cmp dl, 0 ;Если не 0
jne .loop ;То вернуться в начало цикла
;Уменьшение ECX на 2:
dec ecx
dec ecx
;Последний символ строки поместим в DL:
mov dl, [eax+ecx]
;Если это не символ новой строки:
cmp dl, 0x0A
;То выйти
jne .quit
;иначе отрезать его
;(поместить на его место символ конца строки)
mov [eax+ecx], byte 0
.quit:
;Завершение функции
ret
Компиляция:
nasm -felf chomp.asm -o chomp.o
Компоновка:
ld chomp.o -shared -o chomp.so