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的更多相关文章

  1. 第八周读书笔记(人月神话X月亮与六便士)——到底什么才是一个程序员的自我修养?

    写了这么久的读书笔记,涉及到问题大多是一些如何把软件工程做好,如何把自己的职业生涯做好.但总感觉逻辑链上缺了一环,亦即:我们为什么要把软件工程做好,我们成为一名优秀的职业生涯的意义到底在于什么?我觉得 ...

  2. pwn学习日记Day21 《程序员的自我修养》读书笔记

    Linux内核装载ELF过程 (1)bash进程调用fork()系统调用创建一个新的进程 (2)新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程 ...

  3. pwn学习日记Day20 《程序员的自我修养》读书笔记

    可执行文件的装载与进程 覆盖装入和页映射是两种典型的动态装载方法 进程建立的三步 1.创建一个独立的虚拟地址空间 2.读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系. 3.将CPU的指令寄存 ...

  4. pwn学习日记Day19 《程序员的自我修养》读书笔记

    windows PE/COFF章总结 本章学习了windows下的可执行文件和目标文件格式PE/COFF.PE/COFF文件与ELF文件非常相似,它们都是基于段的结构的二进制文件格式.Windows下 ...

  5. gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)

    最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...

  6. 程序员的自我修养(2)——计算机网络(转) good

    相关文章:程序员的自我修养——操作系统篇 几乎所有的计算机程序,都会牵涉到网络通信.因此,了解计算机基础网络知识,对每一个程序员来说都是异常重要的. 本文在介绍一些基础网络知识的同时,给出了一些高质量 ...

  7. 《程序员思维修炼》读书笔记——week4

    <程序员思维修炼>读书笔记——week4 PB16061441 陈昶金 这周读的是Andy Hunt的著作<程序员思维修炼>,这本书对于我这种刚刚入门的新手很友好,大多是讲一些 ...

  8. pwn学习日记Day18 《程序员的自我修养》读书笔记

    知识杂项 obj文件:当前源代码编译成二进制目标文件 exe文件:将.obj文件与库文件.lib等文件链接生成的可执行文件 一个现代编译器的主要工作流程如下: 源程序(source code)→ 预处 ...

  9. 《程序员的自我修养》读书笔记——系统调用、API

        系统调用 程序运行的时候,本身是没有权限访问多少系统资源的.系统资源有限,如果操作系统不进行控制,那么各个程序难免会产生冲突.线程操作系统都将可能产生冲突的系统资源保护起来,阻止程序直接访问. ...

  10. Java程序员的自我修养

    一.自我修养路线图 如图,这是笔者所走的路.且不论这路走的对不对,这个过程中行业环境会影响到你,大可不必钻牛角尖.附上这张图的目的是为了说,如果你想成为一个优秀的程序员,那么你一定要有规划.当然,别想 ...

随机推荐

  1. 微信开发(一)内网映射之natapp的使用

    1.https://natapp.cn/client/lists 从官网下载客户端和注册账号 2.打开文件后退出 当前Ctrl+C 输入natapp -authtoken=xxxxx 此为从我的客户端 ...

  2. JQuery EasyUI DataGrid根据条件设置表格行样式(背景色)

    1.javascript定义函数返回样式 <script type="text/javascript"> //根据条件设置表格行背景颜色 function setRow ...

  3. Xcode的一个简单的UITests

    国内写Tests的很少,写UITests的更少了...或许只是我眼见不够开阔.网上那么几篇都是Swift的.这里给个简单的OC. - (void)viewDidLoad { [super viewDi ...

  4. windows 安装 mongodb

    windows 安装 mongodb 下载 首先到官网下载合适的安装包,下载地址为 https://www.mongodb.com/download-center MongoDB for Window ...

  5. 《A Convolutional Neural Network Cascade for Face Detection》

    文章链接:   http://pan.baidu.com/s/1bQBJMQ  密码:4772 作者在这里提出了基于神经网络的Cascade方法,Cascade最早可追溯到Haar Feature提取 ...

  6. Ansible Ubuntu 安装部署

    一.安装: $ sudo apt-get install ansible 二.配置: a.基本配置 $ cd /etc/ansible/ $ sudo cp hosts hosts_back 备份一个 ...

  7. Lintcode 157. 判断字符串是否没有重复字符

    ------------------------ 因为字符究竟是什么样的无法确定(比如编码之类的),恐怕是没办法假设使用多大空间(位.数组)来标记出现次数的,集合应该可以但感觉会严重拖慢速度... 还 ...

  8. CentOS 7.2安装docker-compose运行gitlib

    服务器已经安装好docker 启动: service start docker 安装docker-compose: 安装pip:sudo yum search pip  / sudo yum inst ...

  9. javascrip中cookie的使用详细分析

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  10. parted LVM划分4T磁盘,在线扩展1.5T

      磁盘分区: parted /dev/emcpowera (parted) print Model: Unknown (unknown) Disk /dev/emcpowera: 4398GB Se ...