请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
WinDbg
请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
Dic4000
2015-10-13, 21:58 下午
我是一个WinDbg初学者,刚刚来到这里的论坛
,目前我在学习调试一个简单的C程序时遇到了一个问题,搜索了很长时间,也没找到一个明确的答案,希望大家能给我点提示。
程序如下:
#include<stdio.h>
int main(void)
{
int a = 1235;
const char *str = "abcdef";
printf("a=%d,str=%s\n", a, str);
int b = 9;
int sum = SumX(a, b, 3, 1);
printf("sum=%d", sum);
return 0;
}
int SumX(int a, int b, int d, int e)
{
int c = a + b;
return c;
}
在汇编模式下跟踪到 const char *str = "abcdef"; 这一语句时,显示的汇编语句是:
mov dword ptr[ebp - 8], offset main!_NULL_IMPORT_DESCRIPTOR <PERF>(main + 0x22000) (011d2000)
我对于这里的 offset main!_NULL_IMPORT_DESCRIPTOR 命令不是很明白,我用命令
da main + 0x22000 查看内存,显示的如同预期一样是“abcdef”,但是用命令
da main!_NULL_IMPORT_DESCRIPTOR 却显示的是“” (空字符串),用x main!_NULL_IMPORT_DESCRIPTOR 查看地址是0x011d1268, 这个地址0x011d1268与(main + 0x22000 = 0x011d2000) 并不一致。
后来我发现<PERF>是 performance - optimized code的含义,但我编译此程序是用命令行并没有打开任何优化开关
编译程序用的是Visual Studio 2013 x86 命令行工具
我想知道对于“const char *str = "abcdef" 语句 为何会反汇编出offset main!_NULL_IMPORT_DESCRIPTOR 这样的语句,却找不到相应地址中的内容,这个和const变量有什么关系吗?
能为我讲讲原因吗?不甚感激~~~
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
悬崖遛马
2015-10-14, 15:32 下午
1. offset main!_NULL*** 和 main!_NULL*** 是不一样的。
2. const 不影响生成的机器码
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
Dic4000
2015-10-15, 00:22 上午
很感谢你的回复,让我知道我弄错的概念了
(汇编也刚刚开始学,很多概念也没理解到位~~~)
。
我把
main!_NULL_IMPORT_DESCRIPTOR 这个Symbol的地址的值(
0x011d126
)当成了Offset(偏移量),我一直以为
地址的偏移量是基于0开始的,所以地址就相当于偏移量了。
我现在还有2个问题想请教下:
1: offset
main!_NULL_IMPORT_DESCRIPTOR 这个语句所取到的偏移量不是基于0计算得到的,那么它是基于哪个位置(段)的呢?
2:Windbg中有没有什么命令或方式可以得到类似于
offset
main!_NULL_IMPORT_DESCRIPTOR 的结果?这个我搜索了好久都没找到。
3:我知道可以使用dumpbin工具可以查看程序中有哪些段以及这些段的范围,在WinDBG中有类似的命令吗?如何知道哪个地址属于哪个段?
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
悬崖遛马
2015-10-16, 10:55 上午
从生成的汇编代码来看,你的代码应该还是启用了优化的,建议到设置里面disable掉所有优化选项。或者用debug模式调试
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
格蠹老雷
2015-10-16, 14:12 下午
1,运行期是就是线性地址空间的偏移地址,等价于线性地址
2,直接用x
main!_NULL_IMPORT_DESCRIPTOR
3,找到模块起始地址,然后!dh <模块起始地址>
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
Dic4000
2015-10-16, 21:30 下午
谢谢楼上的回复,但第二个回答我还是没有弄懂。你是说“x main!_NULL_IMPORT_DESCRIPTOR”命令运行后的结果就是汇编语句“offset main!_NULL_IMPORT_DESCRIPTOR”的结果吗?
可这样对不上啊,你看我新的截图:
main模块的地址范围: 00cd0000H ~ 00cf7000H
x main!main 00cd1000H
x main!_NULL_IMPORT_DESCRIPTOR 00cf1288H
字符串"abcdef" 00cf2000H
这个00cf2000H才是字符串"abcdef"最终在内存中的地址,也是模块的起始地址(00cd0000H)加上00cf2000H的偏移的结果,可那个x main!_NULL_IMPORT_DESCRIPTOR的结果是怎样变成00cf2000H的呢?
Levwz wrote:
从生成的汇编代码来看,你的代码应该还是启用了优化的,建议到设置里面disable掉所有优化选项。或者用debug模式调试
我编译的时候 用-od 关掉了优化,
下面是我的cl编译选项:
- c
- X
- I"E:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\include"
- TC main.c
- Gd
- Od
- FAcs
- Fa"Manual\\"
- Fd"Manual\\"
- Fo"Manual\\mainObj.obj"
- Zi
- Zl
- Za
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
悬崖遛马
2015-10-17, 10:38 上午
我只是看函数开头不是标准栈帧猜测的
不知道编译器对main函数是否有特殊处理
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
Dic4000
2015-10-17, 17:51 下午
用的cdecl调用约定。