我写了一个基本的" 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?
答案 0 :(得分:1)
matherr
。默认实现什么都不做。在某些平台上,可以使用用户定义的代码(ELF系统上的“函数插入”)有选择地替换C库函数,因此您可以实现自己的数学错误处理程序。 AFAIK,Windows上的Portable Executables(PE)无法实现这一点。我想matherr
只是出于兼容性原因才是CRT的一部分。