样板CRT功能matherr有什么意义?

时间:2015-09-20 05:03:46

标签: c disassembly msvcrt boilerplate

我写了一个基本的" Hello World"程序在C:

#include <stdio.h>

int main()
{
        printf("Hello World!\n");
        return 0;
}

然后,我从命令行在MSVC中编译它:

cl hello.c /Fd:hello.pdb /Zi /MD /link /NODEFAULTLIB:LIBCMT.LIB

命令行参数基本上说&#34;生成PDB文件并与MSVCRT.LIB链接而不是LIBCMT.LIB&#34;。

然后,我拆开了程序并查看了各种样板/ CRT功能,并在拆卸中发现了这一点,这很奇怪:

__matherr:
  00401550: 33 C0              xor         eax,eax
  00401552: C3                 ret

这基本上是一个函数,只要它被调用,它总是在EAX中返回0。根据此函数的the documentation,当出现数学错误时返回0,当没有错误时返回非0。

有没有人能够回答为什么这个函数(在数学错误的情况下应该返回0)包含在可执行文件中并且硬编码为总是返回0?

1 个答案:

答案 0 :(得分:1)

如果检测到数学异常,则应该从各种数学函数调用

matherr。默认实现什么都不做。在某些平台上,可以使用用户定义的代码(ELF系统上的“函数插入”)有选择地替换C库函数,因此您可以实现自己的数学错误处理程序。 AFAIK,Windows上的Portable Executables(PE)无法实现这一点。我想matherr只是出于兼容性原因才是CRT的一部分。