C ++链接器如何处理对静态字符串的引用?

时间:2017-10-20 18:04:42

标签: c++ windows x86 portable-executable

我正在尝试更好地理解Windows PE可执行文件的结构,即C ++链接器如何处理静态变量引用。 (就我的Visual Studio C ++而言。)

说我有以下示例:

::PathFindExtension(L"file.exe");

可能会转换为以下程序集(在本例中为Debug构建):

enter image description here

我理解指向PathFindExtension指令的call API指针,并在加载相应的DLL时插入到.exe文件启动时的PE图像中,但是我我不清楚如何处理指向静态字符串的指针。

如您所见push指令:

00568AC6 68 70 48 60 00   push        offset string L"file.exe" (604870h)

68 id机器码,或PUSH imm32 [source],因此imm32只是对内存的绝对引用,或604870h在这种情况下:

enter image description here

但我的问题是,由于该值在编译时是硬编码的,所以如何计算该偏移(即604870h)?

第二个问题,ASLR如何处理这种情况,即当这个可执行文件可以加载到内存中的某个任意地址时? (如果我正确理解ASLR概念。)

0 个答案:

没有答案