кто нибуть занимался написанием shared libraries в nasm?
проблема следующая - имеем код (как написано в доках по nasm):
$ cat intruder.asm
BITS 32
SECTION .text
extern process_path
extern _GLOBAL_OFFSET_TABLE_
%macro get_GOT 0
call %%getgot
%%getgot:
pop ebx
add ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc
%endmacro
update_ebx:
global update_ebx:function
pushad
push ebx
get_GOT
call process_path wrt ..plt
add esp, 4
mov [esp-4*4], eax
popad
ret
$ cat sandbox.c
#include <stdio.h>
extern char* process_path(char *path)
{
printf("%s\n", path);
return path;
}
$ gcc -Wall -pedantic -fPIC -c -mtune=i686 -O3 -mmmx -msse -msse2 -malign-double -osandbox.o sandbox.c
$ nasm -ointruder.o -f elf intruder.asm
$ ld -shared -fPIC -o installtrace.so sandbox.o intruder.o -ldl -lc
почему то при запуске функции в этой библиотеке имеем (отладчик самопальный - сильно не ругайте):
command = 00e85360, eip = b7ef92a0, ebx = b7f0e747
command = 0000e853, eip = b7ef92a1, ebx = b7f0e747
command = 000000e8, eip = b7ef92a2, ebx = b7f0e747
command = c1c3815b, eip = b7ef92a7, ebx = b7f0e747
command = 10c1c381, eip = b7ef92a8, ebx = b7ef92a7
command = ffff99e8, eip = b7ef92ae, ebx = b7efa368
command = 0010a3ff, eip = b7ef924c, ebx = b7efa368
command = ffffffff, eip = 00000252, ebx = b7efa368
т.е. оно уходит по непонятному адресу - даже в таблице символов он не определен:
$ nm installtrace.so
000002a7 t ..@5.getgot
0000137c A __bss_start
000012c0 A _DYNAMIC
0000137c A _edata
000002bf t end
0000137c A _end
00001368 a _GLOBAL_OFFSET_TABLE_
0000028e t __i686.get_pc_thunk.bx
00000260 T process_path
U puts@@GLIBC_2.0
000002a0 t update_ebx
Что я делаю не так? :(