Re: 请教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调用约定。

Powered by Community Server Powered by CnForums.Net