Primero puede identificar cuáles son el principio y el final de las diferentes secciones en su ejecutable. Para ello, es necesario agregar, finalmente, algunas variables en el guión de enlazado alrededor de cada sección de esta manera:
SECTIONS {
[...]
.data : {
data_start = .;
*(.data)
data_end = .;
}
[...]
}
Luego, puede declarar estas variables como externa en su código C/C++ y utilizarlos directamente para comparar la dirección que quiero identificar
Puede que no sea fácil modificar la secuencia de comandos del enlazador. Con gcc, se puede volcar con:
gcc -Wl,-verbose whatever.c
luego tratar de encontrar las variables ya definidas en la salida (desordenado).
Para obtener los límites de la pila, puede crear una instancia de una variable ficticia al comienzo de su función main() y guardar su dirección como la parte superior de la pila, luego crear otra en la posición actual, lo que hará darte el final Sin embargo, tenga en cuenta que el compilador puede no comportarse exactamente así (el orden de pila de las variables en C no está garantizado, ni siquiera el uso de la pila) por lo que debería funcionar, pero no ser portátil.
Finalmente, para el montón, no tengo truco. Debo inferir que una variable que no está en datos/bss/derivada y no en la pila estaría en el montón (sin incluir los registros, pero si puede obtener la dirección, apostaría que el compilador nunca usará un almacenamiento de registro solamente)
No es posible, al menos no de una manera portátil. – juanchopanza
¿Qué problema estás tratando de resolver? ¿Necesita una solución en tiempo de ejecución o en tiempo de compilación? los registros no tienen direcciones. –
Acabamos de tener un argumento sobre si la variable global pertenecería a stack o heap, queríamos confirmarlo nosotros mismos: P –