Почему таблица символов не содержит имени переменной?

Создайте 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 похожие вопросы, но на первой странице результатов поиска не увидел ни одного. Извините, если это обман.

Ожидаются имена глобальных переменных, а не локальных.

Slava 11.03.2024 22:02

Ах, понял. Спасибо! Кажется, также ожидаются локальные статические переменные (stackoverflow.com/questions/14907225/…).

Roy 11.03.2024 22:33

Локальная переменная, отличная от static, обычно представляет собой просто смещение, добавленное к указателю стека или регистру, но ваш пробег может отличаться (особенно в редких системах без стека).

user4581301 11.03.2024 22:47

Локальные переменные не имеют фиксированных адресов и могут иметь несколько адресов одновременно, что не могут адекватно выразить таблицы статических символов.

user207421 12.03.2024 12:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Имена символов существуют для того, чтобы связать одну библиотеку или модуль компиляции с другой. Локальные переменные не видны за границами библиотеки или единицы компиляции. Поэтому они никогда не приближаются к таблице символов.

Глобальные переменные, имена функций и некоторые служебные вещи, такие как локальная инициализация потока или инициализация таблицы виртуальных функций, могут оказаться в таблицах символов. Даже в этом случае это будет зависеть от деталей вашей среды выполнения.

В целях отладки может быть сгенерирована отладочная информация с подробным описанием типа и имени смещения стека внутри функций, но она не является частью таблицы символов.

Другие вопросы по теме