首页
社区
课程
招聘
[求助]MSVC编译链接找不到符号
发表于: 2020-12-27 11:17 12122

[求助]MSVC编译链接找不到符号

2020-12-27 11:17
12122

这么做目的是要自己在使用mfc的dll中暴露一个入口函数,处理下线程附加事件,原本有一个m$的帖子介绍这个,使用的是修改库cpp文件的方式.但是实在比较麻烦
后来想到,连接时候改个入口函数,在去调用原来的不就结了?写个简单的代码实验下.这一试试就出问题了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#define _WIN32_WINNT 0x0502
#include <SDKDDKVer.h>
//MFC程序必须的头文件
#include <afxwin.h>
 
//使用编译命令
//cl main.cpp /c /D_WINDLL /D_AFXDLL /DNDEBUG /MD
//link main.obj /dll /ENTRY:DllMain2
 
class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance()
    {
        return CWinApp::InitInstance();
    }
    virtual int ExitInstance()
    {
        return CWinApp::ExitInstance();
    }
};
CMyApp theApp;
 
BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
);
BOOL APIENTRY DllMain2(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    return DllMain(hModule, ul_reason_for_call, lpReserved);
}

不加/ENTRY:DllMain2生成dll ok,但是如果加了就会出现链接错误,而且还比较多,看了下还是memset这种常用的c库函数.这到底是怎么回事?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mfcs140.lib(dllmodulx.obj) : error LNK2001: 无法解析的外部符号 _memset
msvcrt.lib(utility_desktop.obj) : error LNK2001: 无法解析的外部符号 _memset
atls.lib(atlbase.obj) : error LNK2001: 无法解析的外部符号 _memset
main.obj : error LNK2001: 无法解析的外部符号 _memset
mfcs140.lib(dllmodul.obj) : error LNK2001: 无法解析的外部符号 _memset
mfcs140.lib(nolib.obj) : error LNK2001: 无法解析的外部符号 _memset
mfcs140.lib(stdafx.obj) : error LNK2001: 无法解析的外部符号 _memset
mfcs140.lib(dllmodulx.obj) : error LNK2001: 无法解析的外部符号 __imp__free
main.obj : error LNK2001: 无法解析的外部符号 __imp__free
mfcs140.lib(dllmodul.obj) : error LNK2001: 无法解析的外部符号 __imp__free
mfcs140.lib(nolib.obj) : error LNK2001: 无法解析的外部符号 __imp__free
mfcs140.lib(stdafx.obj) : error LNK2001: 无法解析的外部符号 __imp__free
mfcs140.lib(dllmodul.obj) : error LNK2001: 无法解析的外部符号 ___std_terminate
mfcs140.lib(nolib.obj) : error LNK2001: 无法解析的外部符号 ___std_terminate
......
atls.lib(atlbase.obj) : error LNK2019: 无法解析的外部符号 _memmove,函数 "void __cdecl ATL::Checked::memmove_s(void *,unsigned int,void const *,unsigned int)" (?memmove_s@Checked@ATL@@YAXPAXIPBXI@Z) 中引用了该符号
main.dll : fatal error LNK1120: 38 个无法解析的外部命令

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 181
活跃值: (621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
那就换GCC或者LLVM编译,
2020-12-27 11:55
0
雪    币: 199
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
柒雪天尚 那就换GCC或者LLVM编译,
mfc这种纯正微软血统的东西能用gcc?
2020-12-27 12:56
0
雪    币: 64
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
为何要改入口?
2021-1-5 10:58
0
雪    币: 244
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
aheadlib你值得拥有
2021-1-5 16:36
0
雪    币: 188
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
xuddk 为何要改入口?

原来的不能处理线程事件,所以要改

当然,我不想按常规出牌也行,就是想改.

最后于 2021-1-10 18:12 被yukihotaru编辑 ,原因:
2021-1-10 18:07
0
雪    币: 4381
活跃值: (4373)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你直接用标准的DLL  加上MFC的支持 静态编译不就是你要的了?   InitInstance 里面本来就有DllMain 肯定编译不过去的.
2021-1-10 21:10
0
雪    币: 188
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Mxixihaha 你直接用标准的DLL 加上MFC的支持 静态编译不就是你要的了? InitInstance 里面本来就有DllMain 肯定编译不过去的.
我用MFC明显就是想要用各种方便的封装类,比如窗口,对话框,那么只要调用MFC库不管使用静态还是动态都是一样必须使用库中的main函数,结果只能是冲突.
2021-1-13 20:16
0
雪    币: 4381
活跃值: (4373)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9

我都说过了  标准的接口也可以加入MFC的使用. Win32 DLL 的入口就很简单的使用各种,包括MFC的类,你只要在IDE里面设置有MFC的支持就行了


有时候吧,都告诉你了还不动脑筋实践.    现在我给你直接MFC DLL的处理方法.



在CPP中加入

#pragma comment(linker,"/ENTRY:MyDllMain")

在 theApp 下一行加入

extern "C"{
	BOOL WINAPI
		_DllMainCRTStartup(
		HANDLE  hDllHandle,
		DWORD   dwReason,
		LPVOID  lpreserved
		);
}

BOOL WINAPI MyDllMain( HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved )
{
	MessageBox(0,L"MFC DLL INIT!",NULL,0x40);

	BOOL Ret = _DllMainCRTStartup( hDllHandle , dwReason , lpreserved);

	AfxMessageBox(L"MFC DLL INIT OK!");

	return Ret;

}

同样InitInstance() 也是正常可以调用的.可以在 InitInstance 代码中加入提示看到

BOOL CTestMFCDllApp::InitInstance()
{
	AfxMessageBox(L"MFC InitInstance()");

	CWinApp::InitInstance();

	return TRUE;
}




方法都是人想出来的.

最后于 2021-1-14 08:25 被Mxixihaha编辑 ,原因:
2021-1-14 08:21
0
雪    币: 1469
活跃值: (440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

看大神指点

最后于 2021-1-14 12:10 被vblank编辑 ,原因: 技术不到家
2021-1-14 09:56
0
雪    币: 4381
活跃值: (4373)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
vblank 指定了入口之后就不会链接默认的那些库了,找不到符号是肯定的。如果是非MFC,可以把缺少的函数手动加上。MFC的话就难搞了哦,一大堆符号。结论是你这个操作行不通
麻烦不要把答案覆盖.  谁说MFC不可以指定入口?  不仅可以指定入口,还可以正常的像标准DLL一样初始化. 上面已经给出方法了. 不要误导.  搜索不到的,不代表就没有. 主要在于你有没有研究方法.
2021-1-14 10:14
0
雪    币: 188
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Mxixihaha 麻烦不要把答案覆盖. 谁说MFC不可以指定入口? 不仅可以指定入口,还可以正常的像标准DLL一样初始化. 上面已经给出方法了. 不要误导. 搜索不到的,不代表就没有. 主要在于你有没有研究方法.
我是的思路确实是按照替换入口函数这个方式走的,但是书上都是介绍DLL的入口函数是`DllMain,`你可以看到也是这么做的.但是确实不知道有`_DllMainCRTStartup`这么一个C函数
在我替换了入口函数后,更是出现找不到memset这种C运行库最常用的函数的错误,我都不知道到底发了什么诡异的操作才能让link出现这种错误.
高手,受教了.虽然问题解决了,但是最开始link错误的原因依旧不明.
2021-1-18 19:31
0
雪    币: 4381
活跃值: (4373)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
yukihotaru 我是的思路确实是按照替换入口函数这个方式走的,但是书上都是介绍DLL的入口函数是`DllMain,`你可以看到也是这么做的.但是确实不知道有`_DllMainCRTStartup`这么一个C函数 在 ...
不可以,因为初始化MFC有很多库,  如果你在之前包含头文件和库 就会重复指定   如果你移除就会找不到.  因为已经封装了  你必须另寻他路.  并且我也是看到你的问题之后,看源代码操作的,我并没有这种需求.   实际上做为一名Cracker  你就得自己找突破点,   你用OD载入就是这个入口 , 所以你可以在外层包一层实现, 搜索引擎不一定有人研究过,找不到正常.
2021-1-18 22:09
0
雪    币: 209
活跃值: (226)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
改了入口, 你所用到的C库函数都没法初始化, 除非你不用. 你自己手动去写
2021-1-19 21:19
0
雪    币: 188
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
礁石的爱 改了入口, 你所用到的C库函数都没法初始化, 除非你不用. 你自己手动去写
今天又来看了下这个诡异的问题,说实话就是有个心结在,为啥换个入口就未定义了,连用的机会都不给你.
无意中又发现个和我一样问题的帖子,人家的更加直接,貌似是新版vs才有...
https://www.v2ex.com/amp/t/366594
2021-1-26 19:56
0
雪    币: 1
活跃值: (608)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
加入#pragma comment(lib, "msvcrtd.lib")
#pragma comment(lib, "vcruntimed.lib")
#pragma comment(lib, "ucrtd.lib")可以解决
2022-2-19 18:14
0
游客
登录 | 注册 方可回帖
返回
//