为什么符号表中没有变量名?

问题描述 投票:0回答:1

创建一个

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 上搜索类似问题,但在搜索结果的第一页上没有看到任何问题。抱歉,如果这是一个骗局。

c++ variables clang++ symbol-table
1个回答
0
投票

符号名称的存在是为了链接一个库或编译。不喜欢另一个人。局部变量在库或编译单元边界上不可见。所以他们永远不会接近符号表。

全局变量、函数名称和一些实用程序内容(例如线程本地初始化或虚拟函数表初始化)可能会出现在符号表中。即使这样,它也取决于您的执行环境的详细信息。

出于调试目的,可以生成详细说明函数内部堆栈偏移量的类型和名称的调试信息:但这不是符号表的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.