数据和指令在运行时放在内存的哪些地方?
1 | // 从低地址到高地址 |
示例
1 | #include <iostream> |
nm命令输出可执行文件符号表
1 | ubuntu@ubuntu-ThinkCentre-M800t-1N000:~/learn$ g++ neicun.cpp |
C++ 在其早期版本中就已经禁止了 char*
指向字符串常量。这是因为字符串常量是存储在只读内存**(.rodata只读数据段)**中的,而 char*
是可修改的,所以不允许 char*
指向它。
nm命令详情
在Linux系统中,你可以使用 nm
命令来查看C++编译后的符号表。下面是如何使用 nm
命令的步骤:
\1. 首先,你需要在终端中编译你的C++程序。例如,如果你的C++文件名为main.cpp
,你可以使用以下g++命令进行编译:
1 | g++ -g -o main main.cpp |
-g
选项是为了在编译时包含调试信息,-o main
是指定输出的可执行文件的名称。
\2. 编译成功后,你可以使用nm
命令来查看符号表。例如:
1 | nm main |
这将会输出你的C++程序的符号表。
请注意,nm
命令的输出可能会非常复杂,因为它会列出程序中所有的符号。每一行都会包含一个符号的地址、符号类型以及符号名称。
符号类型可以是以下之一:
- “T” 或 “t” 表示该符号在文本(代码)段中。
- “D” 或 “d” 表示该符号在初始化的数据段中。
- “B” 或 “b” 表示该符号在未初始化的数据段中。
- “U” 表示该符号在其他地方定义(未定义)。
- “C” 表示该符号为未初始化的公共变量。
- “W” 表示弱符号。
其中大写字母表示全局符号,小写字母表示局部符号。
作者:张泽中