Test Foro de elhacker.net SMF 2.1

Programación => Programación General => 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:
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 (asm) [Seleccionar]
format MS COFF
;entry DllEntryPoint

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

section '.text' code ;readable executable


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

public MiFuncion
public MiFuncion as '_MiFuncion'


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

section '.idata' data ;Mimport data ;readable writeable

 library user,'USER32.DLL'

extrn '__imp__MessageBoxA@16' as MessageBox:dword

;  import user,\
;         MessageBox,'MessageBoxA'

section '.edata' data ;export data readable

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


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 (asm) [Seleccionar]
.386
.model flat, stdcall

MiFuncion PROTO C:DWORD

.code
main:
call miFuncion
ret
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 (asm) [Seleccionar]

format MS COFF
include 'win32ax.inc'
extrn '__imp__ExitProcess@4' as ExitProcess
extrn '_MiFuncion' as MiFuncion
public Main as '_Main'
section '.text' code readable executable
Main:
stdcall MiFuncion
stdcall dword[ExitProcess]


y el codigo de la libreria
Código (asm) [Seleccionar]

format MS COFF
include 'win32ax.inc'
extrn '__imp__MessageBoxA@16' as MessageBox:dword
public MiFuncion as '_MiFuncion'
proc MiFuncion
        invoke  MessageBox,HWND_DESKTOP,cadena,cadena,MB_OK
        ret
        cadena db "asd",0
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

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

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.