Ejercicio 3.1. ¿Cuántos bytes ocupa la función main? ¿cuánto ocupa el archivo ejecutable? Archivo ejecutable: 27,5 KB (28.160 bytes) Función Main: 4Ah bytes = 74 bytes Ejercicio 3.2. ¿Cómo varia el tamaño del archivo ejecutable si quitamos la información de depuración? Archivo ejecutable: 6,00 KB (6.144 bytes) Ejercicio 3.3. ¿Qué función llama a main? __tmainCRTStartup() (kernel32.dll (windows) / GNULib(Linux)). Ejercicio 3.4. ¿Dónde está el código del runtime y de printf? (Ejercicio de pizarra) crt0.c => crt = common runtime. 0 = porque es lo primero que se llama. C = porque es código C. Ejercicio 3.5. ¿Está disponible el código fuente del runtime y las bibliotecas de C? (Ejercicio de pizarra) Las bibliotecas de C sí, del runtime depende de lacdlataforma. Ejercicio 3.6. ¿Qué diferencia hay, a nivel de programación, entre la memoria FLASH-NOR y la FLASHNAND?(Ejercicio de pizarra). Flash-NOR: Acceso aleatorio, Lenta y cara. Flash-NAND: Acceso secuencial, rápida, barata y de mayor capacidad. Ejercicio 3.7. De los esquemas que muestran las figuras anteriores, ¿cuál sigue Rembo (se ejecuta en los ordenadores de los laboratorios de prácticas)? Ejercicio 3.8. ¿En qué posición de memoria física debe estar colocado el código XIP de un IA32?. 0xFFFF0 Ejercicio 3.9. ¿Por qué un compilador puede calcular el tamaño exacto de la sección .bss y no el tamaño exacto de la sección de pila que va a necesitar? En bss se almacenan las variables globales no inicializadas y estas se conocen a priori. Sin embargo el tamaño de la pila no se puede saber puesto que depende por lo general de los datos de entrada. (por ejemplo, no necesita la misma pila fact(10) que fact(100000) Ejercicio 3.10. Usar la herramienta DUMPBIN.EXE para mostrar el tamaño de la sección de pila de un ejecutable ¿Cómo se cambia el tamaño de pila por defecto en Visual Studio C/C++? (Ejercicio de pizarra). dumpbin.exe / headers Stack reserve = tamaño máximo de la pila Stack Commit = Tamaño mínimo disponible al inicio. Propiedades de configuración/Vinculador/Sistema Ejercicio 3.11. Cuáles son los archivos objeto y bibliotecas por defecto con las que vincula un proyecto Visual Studio. kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib; oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib; Ejercicio 3.12. Los nombres que aparecen en la tabla de símbolos no son exactamente iguales que los que aparecen en el código fuente C. ¿Por qué? Ver 3.13 Ejercicio 3.13. ¿Qué es la decoración de símbolos (name mangling)? Para las fases de compilación es necesario identificar de forma única cada función, parámetro o variable. Con este objetivo se creó el “name mangling”. La utilidad de esta convención se ve claramente en funciones donde se permite la sobrecarga de operadores. Ejercicio 3.14. ¿Cómo se decoran las variables globales? Con el prefijo '_' Ejercicio 3.15. ¿Y las funciones C? Con el prefijo '_' Ejercicio 3.16. ¿Y las funciones C++? int f (void) { return 1; } int f (int) { return 0; } void g (void) { int i = f(), j = f(0); } ---int __f_v (void) { return 1; } int __f_i (int) { return 0; } void __g_v (void) { int i = __f_v(), j = __f_i(0); } Ejercicio 3.17. ¿Qué pasa si cambiamos el nombre de hola2.c por hola2.cpp? Habrá errores en el linkado. Ejercicio 3.18. ¿Cuáles son, en general, las operaciones necesarias para enlazar n archivos .obj? 1. Determina si hay algún símbolo no resuelto en los n ficheros objeto. 2. Se crea un fichero exe con las siguientes características: 1. En la sección .code añade las secciones .code de todos los ficheros obj. 2. En la sección .data añade las secciones .data de todos los ficheros obj. 3. En la sección .data? añade las secciones .data? de todos los ficheros obj. 4. En la sección .const añade las secciones .const de todos los ficheros obj. 3. El linker resuelve las referencias pendientes (completa las instrucciones incompletas). Para ello utiliza la tabla de reubicación. Ejercicio 3.19. ¿Se usa la tabla de reubicación cuando ejecutamos el programa Hola.exe en Windows XP? ¿Y en Windows 7? (Ejercicio de pizarra). Ejercicio 3.20. ¿Cómo se usa DUMPBIN.EXE para ver los símbolos definidos en una biblioteca? Probarlo con algún archivo .lib. /linkermembers Ejercicio 3.21. ¿Por qué es más fácil de actualizar las librerías en enlace dinámico? Si se usan dll no hay que recompilar cada ejecutable que la use. Ejercicio 3.22. ¿Qué bibliotecas dll necesita el programa Hola.exe para ejecutar? Comprobarlo con dos herramientas: DUMPBIN y el depurador de Visual Studio. Depurador: ntdll.dll, kernel32.dll, msvcr100d.dll dumpbin.exe: Salen todos menos ntdll.dll Ejercicio 3.23. ¿según el runtime de C, cuál debería ser la definición exacta de main (qué parámetros debería tener y qué debería devolver)? Ejercicio 3.24. ¿Cuántas variables locales tiene la función printf? De los esquemas que muestran la figura 3.2 y la figura 3.3. Ejercicio 3.25. De los esquemas que muestran las figuras anteriores, cuál sigue la BIOS de un PC. Ejercicio 3.26. El siguiente programa se usa para crear un ejecutable con formato de imagen binaría. char Mensaje[100]= "Pulsar ESC para continuar..."; // Variable global ... void main (void) { ... EscribeEnPantalla(Mensaje); ... Se ha compilado y enlazado suponiendo dirección de carga = 0xc000 0000. ¿Qué pasaría si se carga en la dirección 0xd000 0000? ¿Qué tipo de instrucciones tendrían problemas para su ejecución? Ejercicio 3.27. ¿Cuál es el tamaño por defecto de la pila en un programa creado con Visual Studio 2008? Hacer un programa que, permita averiguarlo (con ayuda del depurador). Ejercicio 3.28. ¿Cómo decora el compilador las variables locales? Ejercicio 3.29. En la tabla de reubicación de hola1.obj hay símbolos que no aparecen en la tabla de reubicación de Hola1.exe. ¿Por qué no son necesarios? Ejercicio 3.30. ¿Qué bibliotecas dll necesita el programa Notepad.exe para ejecutar? Comprobarlo usando el depurador de Visual Studio. Usar la ventana de módulos del depurador y asociar el depurador a un proceso en ejecución (en el menú principal, Depurar→Asociar al proceso…).