Сначала вы можете определить, что является началом и концом различных разделов в вашем исполняемом файле. Для этого вам нужно в конце концов добавить некоторые переменные в скрипт компоновщика вокруг каждого раздела, например:
SECTIONS {
[...]
.data : {
data_start = .;
*(.data)
data_end = .;
}
[...]
}
Затем вы можете объявить эти переменные как внешние в своем коде C/C++ и использовать их напрямую для сравнения адреса, который вы хотите идентифицировать.
Может быть непросто настроить скрипт компоновщика. С gcc вы можете сбросить его с помощью:
gcc -Wl,-verbose whatever.c
затем попытайтесь найти переменные, уже определенные в (беспорядочном) выводе.
Чтобы получить границы стека, вы можете создать экземпляр фиктивной переменной в начале вашей функции main() и сохранить ее адрес в качестве вершины стека, а затем создать еще один экземпляр в текущей позиции, что даст вам нижнюю часть. . Однако обратите внимание, что компилятор может вести себя не совсем так (порядок стека переменных в C не гарантируется, даже использование стека), поэтому это должно работать, но не быть переносимым.
Наконец, для кучи у меня нет хитрости. Я бы просто предположил, что переменная не в data/bss/derivated и не в стеке будет в куче (исключая регистры, но если вы можете получить адрес, я бы поспорил, что компилятор никогда не будет использовать хранилище только для регистров ).
person
calandoa
schedule
06.08.2012