[C con Clase] ¿Alguien sabe destripar librerías...?

xonly xonly2002 en yahoo.es
Vie Ago 29 22:54:10 CEST 2008


P> #define Mensaje "Hola mundo"
P> #include <fcntl.h>
P> int main() {
P>  write (1, Mensaje, sizeof(Mensaje) - 1);
P>  return 0;
P> }
P> En código asm, 20 líneas
P> 16.091 bytes de programa
P> #include <stdio.h>
P> int main() {
P>  printf("Hola mundo");
P>  return 0;
P> }
P> 15.473 bytes
P> Mucho menos de lo que tú mencionas. No estamos incluyendo templates y 
P> las llamadas

ciertamente con otras historias que estoy probando, también he mejorado, con la compilación del WinASM me da 2.560 bytes y el código en asm es:
Include Console.Inc

.CODE

Start:

	; estas líneas estaban metidas en un procedimiento main que se puede traducir directamente por un Pincipal pero mejor sin nada
	EscribeTexto Texto1
	PulsaEnter Texto2,buferteclado
	
	Invoke ExitProcess,0 	;para salir del programa, se requiere incluir kernel32.inc

End Start
---------------------------------
y el include:

.586

.MODEL flat, stdcall

OPTION CASEMAP:NONE

Include kernel32.inc
Include masm32.inc

IncludeLib kernel32.lib	;imprescindible para el kernel32.inc y también para Stdout y Stdin que por lo visto en masm32
					; se llaman a parte de esta libreria
IncludeLib masm32.lib	;imprescindible para masm32.inc

EscribeTexto Macro txt:REQ
	Invoke StdOut,ADDR txt 	;requiere el masm32.inc
EndM

PulsaEnter Macro prompt:REQ,buffer:REQ
	Invoke StdOut,ADDR prompt				;requiere el masm32.inc
	Invoke StdIn,ADDR buffer, LengthOf buffer	;requiere el masm32.inc
EndM

.CONST

.DATA
Texto1	DB "primer programa ",0AH,0DH,0
Texto2	DB "Pulsa Enter para salir",0

.DATA?
buferteclado	DB 10 DUP (?)
-----------------------------------------

Con el código en C, ciertamente tengo lo mismo que tu puesto en principio, pero ahora he probado a ir incluyendo en el fichero todos los códigos de la librería que he ido "recortando" y se me ha quedado en 3.584 bytes, aunque no pongo aquí el cógido porque sería morirse, pero como decía he cogido cachos creo que de unos 26 ficheros diferentes, y aún así parece que quedan todavía más ficheros, pues tengo que importar ahora como unas 10 librerías.

P> Pero no hemos acabado, si eliminamos la información de símbolos y 
P> reposicionamiento (necesaria si queremos que se pueda cargar en otra 
P> dirección de memoria virtual), ambos casos bajan a 5.632 bytes.
P> Y buena parte de ese espacio se debe a "redondeos" de las secciones del 
P> ejecutable, para que sea múltiplo del tamaño de página, etc. Podría 
P> comprimirse más. Sin ir más lejos, podríamos eliminar los últimos 322 bytes.
P> Pero tienes que tener en cuenta la sobrecarga que se añáde al principio. 
P> Así, los primeros 1024 bytes del ejecutable no contienen nada del programa.

hey me interesa muchísimo saber eso de los 1024 bytes y demás, ¿dónde puedo encontrar más información?

P> Sólo el stub de msdos y la definición de lñas secciones. 
P> Además el compilador añade antes de tu programa algo más de código para 
P> procesar los argumentos del programa, establecer el acceso a la consola...
P> En todo caso es un tamaño fijo, que en programas que no sean un "hola 
P> mundo" es superado por el código del propio programa.
P> Si te empeñas en seguir reduciendo el tamaño, podemos usar un compresor, 
P> como upx, bajando a 3584 bytes.

no es por ir reduciendo tamaño, sino más bien por eliminar operaciones inútiles que mete las librerías sin que yo las necesite ni le haya dicho que haga eso (como la puñetera conversión que me hace en visual)

P> Puedes usar nasm.

lo de usar esto de WinASM, es que me ha impresionado que exista un IDE para ASM el caso es que funciona, pero no me ha gustado que tenga que importar lo de kernel32.lib y lo de masm32.lib, pues estos ficeros están en binario y no en ASM, sabes si el NASM tiene esos ficheros en ASM u otro lenguaje entendible...

P> No lo confunde. Se debe a la diferencia de charsets entre MS-DOS y 
P> Windows. En todo caso, esas conversiones y "funciones y funciones" deben 
P> estar en alguna librería del sistema, no en tu programa. La consola 
P> utiliza el mismo charset que los antiguos programas de ms-dos. Redirige 
P> la salida a un archivo y verás cómo puedes leer los caracteres bien en 
P> Windows.

no sé como se puede redirigir una salida de msdos a una ventana de windows que no sea a través de consola..., pero entiendo perfectamente tu razonamiento, por eso tal vez en visual haga esa conversión, pero la verdad es que si no metemos caracteres raros, no me hace falta convertir nada, pues coincide las letras normales con cualquier tipo de "charset", o no?

P> Las prioridades han cambiado. Antes lo importante era que el programa 
P> ocupase poco, debiendo los programadores adaptar los programas a la 
P> máquina. Ahora es al revés, la prioridad está en que los programadores 
P> puedan programar de forma rápida, fácil y segura, aunque ello conlleve 
P> un ligero aumento del espacio. Es más importante el programador que la 
P> máquina, gracias a la Ley de Moore.

el caso es que toda ley tiene una excepción, y no creo que esta ley de moore tienda a infinito, sobre todo porque si los clientes no pueden pagar a la industria de miniaturización con las épocas de recesión que quedan por venir, por mucha "posibilidad que haya" si no hay dinero, no hay miniaturización, y si no se puede aprovechar mejor los recursos que se tienen, habrá que esperar mejor a los extraterrestres que vengan a salvarnos....

muchas gracias por tus comentarios, se vé que tienes conocimientos internos de como va un ejecutable por dentro, me interesaría saber más como dice la peli de STARSHIP TROOPERS


Más información sobre la lista de distribución Cconclase