Esa pregunta depende del número de variables utilizadas. Como no especificaste qué compilador o lenguaje o incluso el sistema operativo, ¡es difícil definirlo! Todo depende del sistema operativo que es responsable de la administración de la memoria de las aplicaciones. En resumen, no hay una respuesta definitiva a esta pregunta, piense en esto, el compilador/enlazador en tiempo de ejecución, solicita al sistema operativo que asigne un bloque de memoria, esa asignación depende de cuántas variables hay, qué tan grandes son, el alcance y uso de las variables. Por ejemplo, este programa simple en C, en un archivo llamado simpletest.c
:
#include <stdio.h>
int main(int argc, char **argv){
int num = 42;
printf("The number is %d!\n", num);
return 0;
}
Suponiendo que el medio ambiente se basa en Unix/Linux y fue compilado como esto:
gcc -o simpletest simpletest.c
Si se va a emitir un objdump
o nm
en la imagen binaria simpletest
, verá las secciones del ejecutable, en este caso, 'bss', 'texto'. Tome nota de los tamaños de estas secciones, ahora agregue un int var[100];
al código anterior, recompile y vuelva a emitir el objdump
o nm
, encontrará que ha aparecido la sección data
, ¿por qué? porque agregamos una variable de un tipo de matriz de int, con 100 elementos.
Este ejercicio simple demostrará que las secciones crecen y, por lo tanto, el binario se agranda, y también demostrará que no puede predeterminar cuánta memoria se asignará, ya que la implementación en tiempo de ejecución varía de compilador a compilador y de funcionamiento sistema a sistema operativo.
En resumen, el sistema operativo llama a la gestión de memoria.
Gracias por el tutorial detallado! Sin embargo, me queda un acertijo: ¿cómo determinaste que el primer encabezado del programa correspondía al segmento de código del proceso y el segundo a su segmento de datos? ¿Convención? ¿El hecho de que uno es RO (huele a .code) y el otro es RW? (¿Qué pasa si hay dos RO o dos secciones de RW?) – U007D
Sí, es una regla, y también el primer segmento está marcado como ejecutable, por lo que debe ser __code__. – 4pie0