转载一篇 旓旓大叔写的文章
传说门http://soso.x64asm.com/?p=11
x64汇编站点:http://www.x64asm.com/
-----------------------------------------------------------------------
VC2010想必很多人都用过,其功能自不必说,但是有个问题,如果是动态链接的话,他会链接到MSVCR100.DLL里,MSVCR100需要安装庞大的VC2010运行时;如果静态链接的话,还没有书写什么代码,程序已经几百KB。有没有办法让他既是动态链接,而又在发布的时候不用附带VC运行时呢?办法就是链接到系统自带的MSVCRT.DLL。
首先我们必须要求链接器不能链接到默认的LIB里
需要用参数指定不能链接以下LIB
#pragma comment(linker,”/nodefaultlib:libcmt.lib”)
#pragma comment(linker,”/nodefaultlib:msvcrtd.lib”)
#pragma comment(linker,”/nodefaultlib:oldnames.lib”)
然后 我们仍然需要调用VC运行时函数,所以我们需要设置默认链接
为系统自带的MSVCRT.LIB(从WINDOWS SDK里拷贝).
#pragma comment(lib,”msvcrt.lib”)
因为VC自身的入口点程序wWinMainCRTStartup会引用到MSVCR100.DLL里的代码,因此入口点需要重写,如下:
int wWinMainCRTStartup();
int wWinMainCRTStartup()
{
ExitProcess(
(wWinMain(
GetModuleHandle(NULL),
NULL,
(LPWSTR)GetCommandLine,
SW_SHOW))
);
/*以下代码用来进行测试是否链接到MSVCRT.DLL*/
TCHAR wszBuffer[256];
_tcslen(TEXT(“CopyRight 2003-2011 Ripple All Rights Reserved!”));
_tcscmp(TEXT(“旖旎”),TEXT(“Ripple”));
_tcscpy((TCHAR*)&wszBuffer,TEXT(“旖旎版权所有”));
}
虽然我们进行了上述设置,然而编译器在某些地方还会隐藏的引用到MSVCR100里的函数,所以我们必须让链接器不能使用这类隐藏引用。
我们在这里禁用缓冲区安全检查,基本运行时检查设置为默认值.

现在我们编译链接后,查看生成的文件导入表,发现导入的是系统的MSVCRT.DLL的函数。

编译,链接,运行后界面截图:

传说门http://soso.x64asm.com/?p=11
x64汇编站点:http://www.x64asm.com/
-----------------------------------------------------------------------
VC2010想必很多人都用过,其功能自不必说,但是有个问题,如果是动态链接的话,他会链接到MSVCR100.DLL里,MSVCR100需要安装庞大的VC2010运行时;如果静态链接的话,还没有书写什么代码,程序已经几百KB。有没有办法让他既是动态链接,而又在发布的时候不用附带VC运行时呢?办法就是链接到系统自带的MSVCRT.DLL。
首先我们必须要求链接器不能链接到默认的LIB里
需要用参数指定不能链接以下LIB
#pragma comment(linker,”/nodefaultlib:libcmt.lib”)
#pragma comment(linker,”/nodefaultlib:msvcrtd.lib”)
#pragma comment(linker,”/nodefaultlib:oldnames.lib”)
然后 我们仍然需要调用VC运行时函数,所以我们需要设置默认链接
为系统自带的MSVCRT.LIB(从WINDOWS SDK里拷贝).
#pragma comment(lib,”msvcrt.lib”)
因为VC自身的入口点程序wWinMainCRTStartup会引用到MSVCR100.DLL里的代码,因此入口点需要重写,如下:
int wWinMainCRTStartup();
int wWinMainCRTStartup()
{
ExitProcess(
(wWinMain(
GetModuleHandle(NULL),
NULL,
(LPWSTR)GetCommandLine,
SW_SHOW))
);
/*以下代码用来进行测试是否链接到MSVCRT.DLL*/
TCHAR wszBuffer[256];
_tcslen(TEXT(“CopyRight 2003-2011 Ripple All Rights Reserved!”));
_tcscmp(TEXT(“旖旎”),TEXT(“Ripple”));
_tcscpy((TCHAR*)&wszBuffer,TEXT(“旖旎版权所有”));
}
虽然我们进行了上述设置,然而编译器在某些地方还会隐藏的引用到MSVCR100里的函数,所以我们必须让链接器不能使用这类隐藏引用。
我们在这里禁用缓冲区安全检查,基本运行时检查设置为默认值.

现在我们编译链接后,查看生成的文件导入表,发现导入的是系统的MSVCRT.DLL的函数。

编译,链接,运行后界面截图:

