Создайте main.cpp
вот так:
int main() {
int a = 1;
int b = 2;
int c = a + b;
int d = c % b;
int e = c + d;
return e;
}
Скомпилируйте его:
clang++ -g -O0 main.cpp
Затем попробуйте просмотреть таблицу символов:
dsymutil -s a.out
Вывод выглядит следующим образом:
----------------------------------------------------------------------
Symbol table for: 'a.out' (arm64)
----------------------------------------------------------------------
Index n_strx n_type n_sect n_desc n_value
======== -------- ------------------ ------ ------ ----------------
[ 0] 00000001 64 (N_SO ) 01 0000 0000000000000000
[ 1] 0000001c 64 (N_SO ) 00 0000 0000000000000000 '/Users/<username>/tmp/'
[ 2] 0000002f 64 (N_SO ) 00 0000 0000000000000000 'main.cpp'
[ 3] 00000038 66 (N_OSO ) 00 0001 0000000065ef7009 '/private/var/folders/75/7ln8mr3j3md23mts9rq7jmcw0000gn/T/main-bf85b7.o'
[ 4] 00000001 2e (N_BNSYM ) 01 0000 0000000100003f4c
[ 5] 00000016 24 (N_FUN ) 01 0000 0000000100003f4c '_main'
[ 6] 00000001 24 (N_FUN ) 00 0000 000000000000005c
[ 7] 00000001 4e (N_ENSYM ) 01 0000 0000000100003f4c
[ 8] 00000001 64 (N_SO ) 01 0000 0000000000000000
[ 9] 00000002 0f ( SECT EXT) 01 0010 0000000100000000 '__mh_execute_header'
[ 10] 00000016 0f ( SECT EXT) 01 0000 0000000100003f4c '_main'
Ни одна из переменных не находится в таблице символов. Интересно, почему.
Думал об этом:
-O0
, который означает отсутствие оптимизации.Так что я вне догадок. Также пытался найти в stackoverflow похожие вопросы, но на первой странице результатов поиска не увидел ни одного. Извините, если это обман.
Ах, понял. Спасибо! Кажется, также ожидаются локальные статические переменные (stackoverflow.com/questions/14907225/…).
Локальная переменная, отличная от static
, обычно представляет собой просто смещение, добавленное к указателю стека или регистру, но ваш пробег может отличаться (особенно в редких системах без стека).
Локальные переменные не имеют фиксированных адресов и могут иметь несколько адресов одновременно, что не могут адекватно выразить таблицы статических символов.
Имена символов существуют для того, чтобы связать одну библиотеку или модуль компиляции с другой. Локальные переменные не видны за границами библиотеки или единицы компиляции. Поэтому они никогда не приближаются к таблице символов.
Глобальные переменные, имена функций и некоторые служебные вещи, такие как локальная инициализация потока или инициализация таблицы виртуальных функций, могут оказаться в таблицах символов. Даже в этом случае это будет зависеть от деталей вашей среды выполнения.
В целях отладки может быть сгенерирована отладочная информация с подробным описанием типа и имени смещения стека внутри функций, но она не является частью таблицы символов.
Ожидаются имена глобальных переменных, а не локальных.