È possibile innanzitutto identificare quali sono l'inizio e la fine delle diverse sezioni nel file eseguibile. Per questo, è necessario aggiungere alla fine alcune variabili nello script del linker intorno ad ogni sezioni in questo modo:
SECTIONS {
[...]
.data : {
data_start = .;
*(.data)
data_end = .;
}
[...]
}
Si può quindi dichiarare queste variabili come esterno nel codice C/C++ e utilizzarli direttamente per confrontare l'indirizzo voglio identificare.
Potrebbe non essere facile modificare lo script del linker. Con gcc, è possibile scaricare con:
gcc -Wl,-verbose whatever.c
poi cerca di trovare le variabili già definite nel uscita (disordinato).
Per ottenere i limiti della pila, è possibile creare un'istanza di una variabile fittizia all'inizio della funzione main() e salvare il suo indirizzo come la parte superiore della pila, quindi istanziarne un'altra nella posizione corrente, che darti il fondo Tuttavia, si noti che il compilatore potrebbe non comportarsi esattamente come questo (l'ordine di stack delle variabili in C non è garantito, nemmeno l'uso dello stack), quindi questo dovrebbe funzionare ma non essere portabile.
Infine, per il mucchio, non ho trucco. Vorrei solo dedurre che una variabile non in data/bss/derivata e non nello stack sarebbe nell'heap (esclusi i registri, ma se riesci a ottenere l'indirizzo, scommetterei che il compilatore non userà mai una memoria di sola registrazione).
Non è possibile, almeno non in un modo portabile. – juanchopanza
Quale problema stai cercando di risolvere? Avete bisogno di una soluzione runtime o in fase di compilazione? i registri non hanno indirizzi. –
Abbiamo appena avuto una discussione se la variabile globale sarebbe appartenuta allo stack o all'heap, volevamo confermarci: P –