我知道这听起来很奇怪,但我不想在我的程序的IAT中看到 MSVCR120.dll 。在新计算机上运行程序时,这总是很糟糕,因为他们没有安装此dll。
经过一些谷歌搜索后,我发现#pragma intrinsic(memcpy)
似乎是为我的问题设计的,但实际上不。
这是一个用于演示的小代码:
#pragma intrinsic(memcpy)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
void main(int argc,char **argv)
{
// simple cat implementation
if (argc>1)
{
FILE *f = fopen(argv[1], "rb");
fseek(f, 0, SEEK_END);
DWORD size = ftell(f);
fseek(f, 0, SEEK_SET);
char *buf = (char*)malloc(size);
fread_s(buf, size, 1, size, f);
// below is nonsense , but for demonstration
char *buf2 = new char[size+1];
memcpy(buf2, buf, size); // this memcpy is **NOT** inlined!
puts(buf2);
}
}
是的,我知道在ntdll中实现了一个memcpy函数,我可以通过GetProcAddress使用它,但现在我想测试#pragma intrinsic(memcpy)
NOT 的工作原因。
上面的代码会生成以下内容:
这个memcpy实际上是在msvcr120.dll中调用真实memcpy函数的包装器。
其IAT中有一个memcpy:
我很确定我已经在我的编译器选项中启用了内部函数:
有解决方案吗?感谢。
编辑:我注意到几乎所有版本的Windows都存在 msvcrt.dll 。那么有没有可以链接msvcrt.dll而不是msvcr120.dll的选项?
答案 0 :(得分:-1)
还有其他选择。如何将您自己的memcpy
功能实现为
void memcpy(void *dest, void *src, unsigned int length)
{
unsigned char * destination = (unsigned char*)dest;
for (int len = 0; len < length; len++)
destination[len] = ((unsigned char*)src)[len];
}