Šta je novo?

Programiranje operativnog sistema

genuine

Slavan
Učlanjen(a)
17.02.2006
Poruke
1,906
Poena
350
imam sledeci problem.. koristim gcc 3.3.4 i nasm za ovaj pokusaj...

ideja je da za pocetak imam mali asm fajl koji treba da uradi inicijalizaciju statickih objekata i pozove main funkciju... medjutim problem je koju funkciju gcc generise za ovaj posao... u debageru sam nasao da postoji jedna funkcija koja poziva sve konstruktore objekata koje proglasim za staticke ... izgleda ovako

000010F8 55 push ebp
000010F9 89E5 mov ebp,esp
000010FB 83EC08 sub esp,byte +0x8
000010FE 817D0CFFFF0000 cmp dword [ebp+0xc],0xffff
00001105 7516 jnz 0x111d
00001107 837D0801 cmp dword [ebp+0x8],byte +0x1
0000110B 7510 jnz 0x111d
0000110D 83EC0C sub esp,byte +0xc
00001110 6804230000 push dword 0x2304 ; adresa jednog objekta koji pravim
00001115 E83E000000 call 0x1158 / adresa njegovog konstruktora
0000111A 83C410 add esp,byte +0x10
0000111D 817D0CFFFF0000 cmp dword [ebp+0xc],0xffff
00001124 7516 jnz 0x113c
00001126 837D0801 cmp dword [ebp+0x8],byte +0x1
0000112A 7510 jnz 0x113c
0000112C 83EC0C sub esp,byte +0xc
0000112F 6808230000 push dword 0x2308 / adresa drugog objekta
00001134 E81F000000 call 0x1158 / adresa njegovog konstruktora
00001139 83C410 add esp,byte +0x10
0000113C C9 leave
0000113D C3 ret


problem je dakle sta ja treba da posaljem ovoj metodi kao parametar
znaci pri pozivu na stek ide eip to je 4 bajta a zatim i ebp to je jos 4 bajta
dakle
cmp dword [ebp+0xc],0xffff
jnz 0x111d
cmp dword [ebp+0x8],byte +0x1
jnz 0x111d

[ebp + 0xc] ce biti jedan agrgument a [ebp+0x8] drugi... da li ja jednostavno da pozovem ovu funkciju sa parametrima 0x1 i oxffff?

funkcija se inace zove _Z41__static_initialization_and_destruction_0ii


skontao sam da pre main-a treba da pozovem ovo cudo _Z41__static_initialization_and_destruction_0ii koje registruje sve destruktore statickih objekata kao i njihove adrese pozivom metode __cxa_atexit za svaki od njih i poziva konstruktore svih statickih objekata.... na kraju (posle main-a) treba da se pozove __cxa_finalize da pozove sve destruktore.. sta je parametar ove finalize metode posto sam iskopao da uzima pokazivac void *....


tek sam poceo a gde sam stigao kukuu :(
 
Poslednja izmena:
Vrh Dno