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
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:
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):
.386
.model flat, stdcall
MiFuncion PROTO C:DWORD
.code
main:
call miFuncion
ret
end main
ml call.asm faLib.lib user32.lib
Muchas gracias por tu respuesta.
Entonces, ¿lib es un comando de VC++?. ¿No conoces alguna forma de linkear el archivo objeto con MinGW ?.
Si, no lo se, consulta la documentacion de MinGW ... tal vez tambien quieras averiguar sobre otros ensambladores como MASM o NASM.
Ok, muchas gracias.
No es necesario el DllEntryPoint ;)
Por ejemplo
Codigo que llama a la lib creada
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
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
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.