博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Windows Via C/C++》读书笔记之dll隐式链接
阅读量:6318 次
发布时间:2019-06-22

本文共 904 字,大约阅读时间需要 3 分钟。

《Windows Via C/C++》读书笔记之dll隐式链接

一、使用方式

exe要隐式链接一个dll,分阶段的需要.h文件,.lib文件和.dll文件。

编译阶段:.h文件提供函数定义及变量定义
链接阶段:.lib文件提供导出函数和变量的符号名称
运行阶段:.dll文件提供代码和数据

TIPS: 查看exe所需的dll,可以使用VC带的dumpbin -imports xxx.exe来查看,或者使用Total Commander查看。

二、理解加载过程

loader扫描exe的import section,加载其所需的dll,这是一个递归的过程,loader也会检查dll的import section,递归load所需的dll。这个过程中,loader会对这些dll保持跟踪,一个dll只会被加载一次,即使多个模块都需要这个dll。

loader在将所有需要的dll加载到地址空间后,开始resolve所有imported symbols,将RVA加上dll加载的基址,保存到exe的import section。当这些完成后,exe引用这些imported symbols就只需要查找exe的imported section,然后把地址取出,就可以直接访问这些symbols了。

三、理解.lib文件

动态库的.lib文件不包含函数或者变量,仅仅是列出了导出函数和变量的符号名称。在链接阶段用于符号resolve。

静态库的.lib文件包含了函数和代码,相当于是目标文件,会被编进PE文件。

四、dll搜索顺序

exe加载dll时的搜索顺序:

1、exe文件所在目录
2、windows系统目录,可用GetWindowsDirectory()获取
3、对于16位系统,在windows目录下的System子目录
4、windows目录,可用GetSystemDirectory()获取
5、进程的当前目录,可用GetCurrentDirectory()获取
6、PATH环境变量指定的目录

 

转载于:https://www.cnblogs.com/shokey520/p/3658054.html

你可能感兴趣的文章
Android IOS WebRTC 音视频开发总结(十九)-- kurento
查看>>
reshape2 数据操作 数据融合( cast)
查看>>
第一章、关于SQL Server数据库的备份和还原(sp_addumpdevice、backup、Restore)
查看>>
八、主从复制
查看>>
深入理解RunLoop 整理资料
查看>>
俄罗斯方块
查看>>
LabVIEW将字符串转化为十进制
查看>>
欢迎光临
查看>>
20131205
查看>>
数组相减
查看>>
【poj 1962】Corporative Network(图论--带权并查集 模版题)
查看>>
使用AngularJS学习MVC的基础知识分享
查看>>
UDP template 代码
查看>>
爬虫 高性能
查看>>
使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(二)
查看>>
干吧跌!~brothers!~~
查看>>
linux 0.11 源码学习(七)
查看>>
函数模板的简单用法
查看>>
利用 LINQ的skip和Take 方法对List实现分页效果
查看>>
python 中的列表解析和生成表达式 - 转
查看>>