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. ORACLE 11G EXPDP交互模式 interactive mode

    expdp导出工具可以实现在导出任务执行过程中修改并行度.终止.监控任务功能. 做实验验证一下: [oracle@test dpdump]$ expdp system/password directo ...

  2. Vim 资料总结

    vi/vim基本使用方法:http://www.cnblogs.com/itech/archive/2009/04/17/1438439.html Vim命令合集: http://www.cnblog ...

  3. Python 网络爬虫(图片采集脚本)

    ===============爬虫原理================== 通过Python访问网站,获取网站的HTML代码,通过正则表达式获取特定的img标签中src的图片地址. 之后再访问图片地址 ...

  4. css keyframes动画属性设置

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. Uiautomator-----新建工程

    一.前提: 安装好安卓开发环境:jdk.安卓SDK.ADT.ant.eclipse   配置环境   二.新建uiautomator工程 1.打开eclipse,新建一个工程(这个网上资料很多,大家自 ...

  6. javaSE基础03

    javaSE基础03 生活中常见的进制:十进制(0-9).星期(七进制(0-6)).时间(十二进制(0-11)).二十四进制(0-23) 进制之间的转换: 十进制转为二进制: 将十进制除以2,直到商为 ...

  7. gdb调试汇编堆栈过程的学习

    gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...

  8. IE8下String的Trim()方法失效的解决方案

    简洁方便 用jquery的trim()方法,$.trim(str)就可以了.

  9. 自定义 URL Scheme 完全指南

    本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处. 注意: 自从自定义 URL 的引入,本文 ...

  10. springmvc session和model解析

    关于springMVC中的session,有2种使用方法,第一种是直接传递httpsession,第二种是使用@SessionAttributes("userId") 注解 这里附 ...