【发布时间】:2018-01-23 05:55:46
【问题描述】:
这是我的 C 程序,其中包含一个静态变量、两个全局变量、一个本地变量和一个外部变量。
#include <stdio.h>
int gvar1;
int gvar2 = 12;
extern int evar = 1;
int main(void)
{
int lvar;
static int svar = 4;
lvar = 2;
gvar1 = 3;
printf ("global1-%d global2-%d local+1-%d static-%d extern-%d\n", gvar1, gvar2, (lvar+1), svar, evar);
return 0;
}
请注意,gvar1、gvar2、evar、lvar 和 svar 都定义为整数。
我使用 objdump 反汇编了代码,debug_str 显示如下:
Contents of section .debug_str:
0000 76617269 61626c65 732e6300 6c6f6e67 variables.c.long
0010 20756e73 69676e65 6420696e 74002f75 unsigned int./u
0020 73657273 2f686f6d 6534302f 72616f70 sers/home40/raop
0030 2f626b75 702f6578 616d706c 65730075 /bkup/examples.u
0040 6e736967 6e656420 63686172 00737661 nsigned char.sva
0050 72006d61 696e006c 6f6e6720 696e7400 r.main.long int.
0060 6c766172 0073686f 72742075 6e736967 lvar.short unsig
0070 6e656420 696e7400 67766172 31006776 ned int.gvar1.gv
0080 61723200 65766172 00474e55 20432034 ar2.evar.GNU C 4
0090 2e342e36 20323031 31303733 31202852 .4.6 20110731 (R
00a0 65642048 61742034 2e342e36 2d332900 ed Hat 4.4.6-3).
00b0 73686f72 7420696e 7400 short int.
为什么会显示如下?
unsigned char.svar
long int.lvar
short unsigned int.gvar1.gvar2.evar
GCC 如何决定它应该存储为哪种类型?
我正在使用 GCC 4.4.6 20110731 (Red Hat 4.4.6-3)
【问题讨论】:
-
... 可能它们只是符号表或一些调试信息,与变量的类型无关。尤其是当它们似乎以相反的字典顺序排序时。
-
这些点中的大多数都具有误导性。如果您查看十六进制代码,很少有真正的点字符
0x2e。大多数是NUL终结者0x00。例如,在序列unsigned char.svar.main.中,所有点都是NUL终结符。这意味着这是三个不相关的字符串。 -
您能解释一下为什么数据段的布局对您很重要吗?您提出问题的动机是什么?
-
诶?这不是程序的反汇编,它是某个对象或调试文件的十六进制转储。为了使用 objdump 我相信你必须给它实际的可执行文件。许多工具链提供了通过调试器进行反汇编的选项,例如通过 gdb。改用它。