Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Avoidance25 en 6 Noviembre 2009, 21:26 pm



Título: ¿Como puedo crear una libreria estatica con flat assembler?
Publicado por: Avoidance25 en 6 Noviembre 2009, 21:26 pm
Tengo un codigo de una dll, que es una modificacion mia de un ejemplo que traia el compilador, y quisiera compilar este codigo de tal manera a que se compile como una libreria estatica (".a" o ". lib"). ¿Como lo hago?

Este es mi codigo:
Código:
format PE GUI 4.0 DLL
entry DllEntryPoint

include 'win32a.inc'
cadena db 'asd',0

;section '.text' code readable executable

proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
        mov     eax,TRUE
        ret
endp


proc MiFuncion
        invoke  MessageBox,HWND_DESKTOP,cadena,cadena,MB_OK
        ret
endp

section '.idata' import data readable writeable

  library user,'USER32.DLL'

  import user,\
         MessageBox,'MessageBoxA'

section '.edata' export data readable

  export 'midll.dll',\
         MiFuncion,'MiFuncion'

section '.reloc' fixups data discardable
 


Título: Re: ¿Como puedo crear una libreria estatica con flat assembler?
Publicado por: Eternal Idol en 6 Noviembre 2009, 23:00 pm
Esto es muy especifico de la herramienta que uses, FASM por lo que veo. Yo no puedo ver como hacerlo aca en el manual:

http://flatassembler.net/docs.php?article=manual#2.4

format PE GUI 4.0 LIB fue mi primera intuicion pero no funciona y obviamente no figura ahi.

Agrego, es posible generar archivos objeto COFF y con VC++ entonces generar una libreria estatica, esto es algo muy basico que apenas ensambla, enlaza y funciona pero tendras que hacer mas.

Tu codigo para .obj:
Código
  1. format MS COFF
  2. ;entry DllEntryPoint
  3.  
  4. include 'win32a.inc'
  5. cadena db 'asd',0
  6.  
  7. section '.text' code ;readable executable
  8.  
  9.  
  10. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
  11.        mov     eax,TRUE
  12.        ret
  13. endp
  14.  
  15. public MiFuncion
  16. public MiFuncion as '_MiFuncion'
  17.  
  18.  
  19. proc MiFuncion
  20.        invoke  MessageBox,HWND_DESKTOP,cadena,cadena,MB_OK
  21.        ret
  22. endp
  23.  
  24. section '.idata' data ;Mimport data ;readable writeable
  25.  
  26.  library user,'USER32.DLL'
  27.  
  28. extrn '__imp__MessageBoxA@16' as MessageBox:dword
  29.  
  30. ;  import user,\
  31. ;         MessageBox,'MessageBoxA'
  32.  
  33. section '.edata' data ;export data readable
  34.  
  35. ;  export 'midll.dll',\
  36. ;         MiFuncion,'MiFuncion'
  37.  
  38.  
  39. section '.reloc' data; fixups data discardable

fasm faLib.asm generara faLib.obj
lib faLib.obj generara faLib.lib

Un ejemplo para llamar a la libreria (MASM):
Código
  1. .386
  2. .model flat, stdcall
  3.  
  4. MiFuncion PROTO C:DWORD
  5.  
  6. .code
  7. main:
  8. call miFuncion
  9. ret
  10. end main

ml call.asm faLib.lib user32.lib


Título: Re: ¿Como puedo crear una libreria estatica con flat assembler?
Publicado por: Avoidance25 en 8 Noviembre 2009, 18:29 pm
Muchas gracias por tu respuesta.

Entonces, ¿lib es un comando de VC++?. ¿No conoces alguna forma de linkear el archivo objeto con MinGW ?.


Título: Re: ¿Como puedo crear una libreria estatica con flat assembler?
Publicado por: Eternal Idol en 8 Noviembre 2009, 18:37 pm
Si, no lo se, consulta la documentacion de MinGW ... tal vez tambien quieras averiguar sobre otros ensambladores como MASM o NASM.


Título: Re: ¿Como puedo crear una libreria estatica con flat assembler?
Publicado por: Avoidance25 en 8 Noviembre 2009, 19:01 pm
Ok, muchas gracias.


Título: Re: ¿Como puedo crear una libreria estatica con flat assembler?
Publicado por: YST en 8 Noviembre 2009, 21:52 pm
No es necesario el DllEntryPoint ;)

Por ejemplo

Codigo que llama a la lib creada
Código
  1. format MS COFF
  2. include 'win32ax.inc'
  3. extrn '__imp__ExitProcess@4' as ExitProcess
  4. extrn '_MiFuncion' as MiFuncion
  5. public Main as '_Main'
  6. section '.text' code readable executable
  7. Main:
  8. stdcall MiFuncion
  9. stdcall dword[ExitProcess]

y el codigo de la libreria
Código
  1. format MS COFF
  2. include 'win32ax.inc'
  3. extrn '__imp__MessageBoxA@16' as MessageBox:dword
  4. public MiFuncion as '_MiFuncion'
  5. proc MiFuncion
  6.        invoke  MessageBox,HWND_DESKTOP,cadena,cadena,MB_OK
  7.        ret
  8.        cadena db "asd",0
  9. endp                            

Para crear la .lib desde el .obj que crea el fasm puedes como decia eternal usar el "lib" del VC++ de la siguiente forma
Código:
lib TuLibreria.obj
y luego para linkear el .obj ( el primero , el del codigo principal ) con la libreria puedes linkear con el link de VC++ de la siguiente manera
Código:
link Principal.obj  /entry:Main /subsystem:windows /DEFAULTLI
B:TuLibreria.lib /DEFAULTLIB:kernel32.lib  /DEFAULTLIB:user32.lib


Título: Re: ¿Como puedo crear una libreria estatica con flat assembler?
Publicado por: Eternal Idol en 8 Noviembre 2009, 23:18 pm
Es su codigo con lo minimo comentado para que ensamble ... en fin, ahora ya sabra otra manera de enlazar el codigo de la libreria estatica que quiere generar con las herramientas que no quiere usar.