Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: marax en 20 Febrero 2021, 19:41 pm



Título: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
Publicado por: marax en 20 Febrero 2021, 19:41 pm
Perdonen la trivialidad... pero un programa en C, por ejemplo, el siguiente:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    printf ("Im the output.");
  6.    getchar ();
  7.  
  8.    return 0;
  9. }

y creo que imposiblemente mas exactamente el mismo programa, pero en ensamblador:

Código
  1. .686
  2. .model FLAT
  3.  
  4. includelib \masm32\lib\msvcrt.lib
  5.  
  6. printf proto C, :dword
  7. getchar proto C
  8. exit proto C, :dword
  9.  
  10.    .data?
  11.    dd ?
  12.  
  13.    .data
  14.      __0 db "Im the output.", 0
  15.  
  16.  .code
  17.  
  18. start:
  19.  
  20.    call main
  21.    invoke exit, 0
  22.  
  23. main proc
  24.    invoke printf, offset __0
  25.    invoke getchar
  26.  
  27.    ret
  28.  
  29. main endp
  30. end start

Producen una salida con una diferencia de ciento veintinueve mil seiscientos cuarenta y dos (129 642) bytes ¡Eso seria un 85.40% mayor, para el mismo algoritmo! ¡Que locura!

¿Por que existe esta diferencia tan abismal?
¿Es la diferencia siempre de este tamaño en terminos porcentuales, o la diferencia existe hasta cierto punto?

Saludos.


Título: Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
Publicado por: Eternal Idol en 20 Febrero 2021, 19:49 pm
El primero tiene la RTL de C completa enlazada estaticamente dentro del ejecutable y el segundo la enlaza dinamicamente (esta es la RTL de C del VC++ en una DLL: msvcrt.dll).

Asi rapidamente vas a notar una diferencia grande: cl /O1 /MD hello.cpp


Título: Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
Publicado por: marax en 20 Febrero 2021, 21:13 pm
El primero tiene la RTL de C completa enlazada estaticamente dentro del ejecutable

Eso no me lo imagine...

Gracias por tu respuesta.
Saludos.


Título: Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
Publicado por: Eternal Idol en 20 Febrero 2021, 21:26 pm
De nadas  ::)

https://foro.elhacker.net/programacion_cc/eliminar_basura_de_los_exes_compilados_en_c-t299411.0.html


Título: Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
Publicado por: marax en 20 Febrero 2021, 21:55 pm
https://foro.elhacker.net/programacion_cc/eliminar_basura_de_los_exes_compilados_en_c-t299411.0.html

Citar
Código
  1.   #define _WIN32_WINNT 0x0403
  2.   #define WIN32_LEAN_AND_MEAN
  3.   #pragma optimize("gsy", on)
  4.   #pragma comment(linker,"/RELEASE")
  5.   #pragma comment(linker, "/IGNORE:4108")
  6.   #pragma comment(linker, "/FIXED")
  7.   #pragma comment(linker, "/STUB:stub.exe")
  8.   #pragma comment(linker, "/MERGE:.rdata=.data")
  9.   //#pragma comment(linker, "/MERGE:.reloc=.data")
  10.   #pragma comment(linker, "/MERGE:.text=.data")
  11.   #pragma comment(linker, "/NODEFAULTLIB")
  12.   #pragma comment(linker, "/ENTRY:DllMain")
  13.   #pragma comment(linker, "/FILEALIGN:16")
  14.   #pragma comment(linker, "/ALIGN:16")
  15.   #pragma pack(1)

¿Me explicarias que exactamente esta pasando aqui con el linker? ¿Que es "gsy"?



¿Por que en el primer programa la libreria se supone estatica y en el segundo dinamica? ¿Cada vez que declaro ID proto C, ... el ensamblador añade un GetProcAddress o algo asi?


Título: Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
Publicado por: Eternal Idol en 20 Febrero 2021, 22:11 pm
Ese pragma es para el compilador:
https://docs.microsoft.com/en-us/cpp/preprocessor/optimize?view=msvc-160

Por el tamaño pero depende de la configuracion del proyecto y lo que termine por pasar en linea de comandos:
https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-160

Si probaras la que te deje verias la diferencia usando el mismo codigo fuente:
cl /O1 /MD hello.cpp



No, pero tu ejecutable tiene por cada uno de los PROTO un funcion importada. Compara los 2 ejecutables con https://www.dependencywalker.com/

PD. GetProcAddress seria enlace dinamico en tiempo de ejecucion y la otra en tiempo de carga (esta en el PE el enlace en si mismo):
https://docs.microsoft.com/en-us/windows/win32/dlls/using-run-time-dynamic-linking


Título: Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
Publicado por: marax en 20 Febrero 2021, 22:33 pm
(https://i.imgur.com/erT6WDp.png)

Asi se ha quedado...

A ver si entendi. En el caso del programa en C, el compilador incluye toda la libreria estatica MSVCRT en el ejecutable, en cambio, en el programa en ASM, el programa usa el codigo de la DLL MSVCRT.DLL, ¿No?

A lo demas tendre que dedicarle un poco de tiempo.


Título: Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
Publicado por: Eternal Idol en 20 Febrero 2021, 22:50 pm
nn2FB1P_Mn8

 ;D

A todo el mundo le funciona ...

(https://i.imgur.com/qjh3SPS.png)

Si, al enlazar una libreria estatica (.LIB de codigo) el primer programa contiene todo el codigo de la RTL en su ejecutable, el segundo simplemente enlaza dinamicamente la DLL (con un .LIB de importacion).