¿Como puedo crear una libreria estatica con flat assembler?

Iniciado por Avoidance25, 6 Noviembre 2009, 21:26 PM

0 Miembros y 1 Visitante están viendo este tema.

Avoidance25

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
--Recuerda siempre que eres único... Exactamente igual que todos los demás.
--Diplomacia es el arte de decir "bonito perrito"... hasta que puedas encontrar una piedra.
--Morir es como dormir, pero sin levantarse a hacer pis.
--En las guerras, los soldados reciben las balas y los generales las medallas.

Eternal Idol

#1
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
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Avoidance25

Muchas gracias por tu respuesta.

Entonces, ¿lib es un comando de VC++?. ¿No conoces alguna forma de linkear el archivo objeto con MinGW ?.
--Recuerda siempre que eres único... Exactamente igual que todos los demás.
--Diplomacia es el arte de decir "bonito perrito"... hasta que puedas encontrar una piedra.
--Morir es como dormir, pero sin levantarse a hacer pis.
--En las guerras, los soldados reciben las balas y los generales las medallas.

Eternal Idol

Si, no lo se, consulta la documentacion de MinGW ... tal vez tambien quieras averiguar sobre otros ensambladores como MASM o NASM.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Avoidance25

--Recuerda siempre que eres único... Exactamente igual que todos los demás.
--Diplomacia es el arte de decir "bonito perrito"... hasta que puedas encontrar una piedra.
--Morir es como dormir, pero sin levantarse a hacer pis.
--En las guerras, los soldados reciben las balas y los generales las medallas.

YST

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


Yo le enseñe a Kayser a usar objetos en ASM

Eternal Idol

#6
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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón