创建一个
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 上搜索类似问题,但在搜索结果的第一页上没有看到任何问题。抱歉,如果这是一个骗局。
符号名称的存在是为了链接一个库或编译。不喜欢另一个人。局部变量在库或编译单元边界上不可见。所以他们永远不会接近符号表。
全局变量、函数名称和一些实用程序内容(例如线程本地初始化或虚拟函数表初始化)可能会出现在符号表中。即使这样,它也取决于您的执行环境的详细信息。
出于调试目的,可以生成详细说明函数内部堆栈偏移量的类型和名称的调试信息:但这不是符号表的一部分。