《程序员的自我修养》读书笔记 - dllimport
Math.c { __declspec (dllexport) double Add (xx, xx) {...}}
MathApp.c { __declspec(dllimport) double Add (xx, xx); }
1.生成dll
cl /LD Math.c =>
Math.obj -
- 因为保存dllexport而保存了/EXPORT:_Add的linker directive,
- 如果没有dllexport,也可以通过link Math.obj /DLL /EXPORT:_Add 导出符号生成dll文件。
Math.dll -
- (与PE格式基本相同, 头文件中符号位标示不同, 默认load addr不同, 其他扩展名: .OCX, .CPL, etc)
- 在不同进程中data是私有的
- ??load以后的代码段不是地址无关的,所以只有在某些情况下可以多进程共享dll代码 (与linux的elf不同)
Math.lib (import lib, MathApp.c需要与之link) , 对Add有两个符号-
- Add : stub code, 形如: [XXX2] Add: JMP DWORD PTR [XXX1] , 其中XXX1为IAT中的一项 (??在load的时候XXX1里面的内容会被改写)
-_imp_add: 直接指向IAT中的所在项,值为XXX1
[Math.exp 临时保存export symbol table,与obj格式相同, 也可能直接保存在dll的.rdata段] -
[ - 导出符号的形式: 形如 _Add@n n为参数堆栈大小,可以通过def文件定义别名实现多语言兼容, 如__stdcall的name修饰也是_Add@n (e.g. WINAPI), _cdecl 不修饰]
2. 生成 MathApp.exe
- 有一个IMAGE_IMPORT_DESCRIPTOR结构,对应于一个被导入的dll,指向该dll相关的一个IAT表和一个INT表
-这里的IAT表: 符号位1: 跟导入符号序号, 符号位0: 跟导入符号的序号hint和符号名
cl /c MathApp.c =>
MathApp.obj
link MathApp.obj Math.lib =>
MathApp.exe
3. dllimport
3.1 cl /LD Math.c 在生成.lib文件时,会在.lib中为Add生成两个符号名Add与_imp_Add
- Add : stub code, 形如: [XXX2] Add: JMP DWORD PTR [XXX1] , 其中XXX1为IAT中的一项 (??在load的时候XXX1里面的内容会被改写)
-_imp_add: 直接指向IAT中的所在项,值为XXX1
3.2 如果MathApp引入Add符号的时候
-有 __declspec(dllimport), 则complile实际生成的符号名为_import_Add, 与Math.lib中的_imp_add对应, link的时候生成形如 CALL DWORD PTR [XXX1]的code
-没有__declspec(dllimport), 则complie的生成的符号名为Add, obj中找不到以后,与Math.lib中的Add对应, link的时候生成形如 CALL XXX2的code, 则运行时先CALL XXX2,再JMP DWORD PTR [XXX1],比 CALL DWORD PTR [XXX1] 多了一次跳转。
《程序员的自我修养》读书笔记 - dllimport的更多相关文章
- 第八周读书笔记(人月神话X月亮与六便士)——到底什么才是一个程序员的自我修养?
写了这么久的读书笔记,涉及到问题大多是一些如何把软件工程做好,如何把自己的职业生涯做好.但总感觉逻辑链上缺了一环,亦即:我们为什么要把软件工程做好,我们成为一名优秀的职业生涯的意义到底在于什么?我觉得 ...
- pwn学习日记Day21 《程序员的自我修养》读书笔记
Linux内核装载ELF过程 (1)bash进程调用fork()系统调用创建一个新的进程 (2)新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程 ...
- pwn学习日记Day20 《程序员的自我修养》读书笔记
可执行文件的装载与进程 覆盖装入和页映射是两种典型的动态装载方法 进程建立的三步 1.创建一个独立的虚拟地址空间 2.读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系. 3.将CPU的指令寄存 ...
- pwn学习日记Day19 《程序员的自我修养》读书笔记
windows PE/COFF章总结 本章学习了windows下的可执行文件和目标文件格式PE/COFF.PE/COFF文件与ELF文件非常相似,它们都是基于段的结构的二进制文件格式.Windows下 ...
- gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)
最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...
- 程序员的自我修养(2)——计算机网络(转) good
相关文章:程序员的自我修养——操作系统篇 几乎所有的计算机程序,都会牵涉到网络通信.因此,了解计算机基础网络知识,对每一个程序员来说都是异常重要的. 本文在介绍一些基础网络知识的同时,给出了一些高质量 ...
- 《程序员思维修炼》读书笔记——week4
<程序员思维修炼>读书笔记——week4 PB16061441 陈昶金 这周读的是Andy Hunt的著作<程序员思维修炼>,这本书对于我这种刚刚入门的新手很友好,大多是讲一些 ...
- pwn学习日记Day18 《程序员的自我修养》读书笔记
知识杂项 obj文件:当前源代码编译成二进制目标文件 exe文件:将.obj文件与库文件.lib等文件链接生成的可执行文件 一个现代编译器的主要工作流程如下: 源程序(source code)→ 预处 ...
- 《程序员的自我修养》读书笔记——系统调用、API
系统调用 程序运行的时候,本身是没有权限访问多少系统资源的.系统资源有限,如果操作系统不进行控制,那么各个程序难免会产生冲突.线程操作系统都将可能产生冲突的系统资源保护起来,阻止程序直接访问. ...
- Java程序员的自我修养
一.自我修养路线图 如图,这是笔者所走的路.且不论这路走的对不对,这个过程中行业环境会影响到你,大可不必钻牛角尖.附上这张图的目的是为了说,如果你想成为一个优秀的程序员,那么你一定要有规划.当然,别想 ...
随机推荐
- 微信开发(一)内网映射之natapp的使用
1.https://natapp.cn/client/lists 从官网下载客户端和注册账号 2.打开文件后退出 当前Ctrl+C 输入natapp -authtoken=xxxxx 此为从我的客户端 ...
- JQuery EasyUI DataGrid根据条件设置表格行样式(背景色)
1.javascript定义函数返回样式 <script type="text/javascript"> //根据条件设置表格行背景颜色 function setRow ...
- Xcode的一个简单的UITests
国内写Tests的很少,写UITests的更少了...或许只是我眼见不够开阔.网上那么几篇都是Swift的.这里给个简单的OC. - (void)viewDidLoad { [super viewDi ...
- windows 安装 mongodb
windows 安装 mongodb 下载 首先到官网下载合适的安装包,下载地址为 https://www.mongodb.com/download-center MongoDB for Window ...
- 《A Convolutional Neural Network Cascade for Face Detection》
文章链接: http://pan.baidu.com/s/1bQBJMQ 密码:4772 作者在这里提出了基于神经网络的Cascade方法,Cascade最早可追溯到Haar Feature提取 ...
- Ansible Ubuntu 安装部署
一.安装: $ sudo apt-get install ansible 二.配置: a.基本配置 $ cd /etc/ansible/ $ sudo cp hosts hosts_back 备份一个 ...
- Lintcode 157. 判断字符串是否没有重复字符
------------------------ 因为字符究竟是什么样的无法确定(比如编码之类的),恐怕是没办法假设使用多大空间(位.数组)来标记出现次数的,集合应该可以但感觉会严重拖慢速度... 还 ...
- CentOS 7.2安装docker-compose运行gitlib
服务器已经安装好docker 启动: service start docker 安装docker-compose: 安装pip:sudo yum search pip / sudo yum inst ...
- javascrip中cookie的使用详细分析
JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...
- parted LVM划分4T磁盘,在线扩展1.5T
磁盘分区: parted /dev/emcpowera (parted) print Model: Unknown (unknown) Disk /dev/emcpowera: 4398GB Se ...