calling c++ from golang with swig--windows dll 四

前面讲述了windows环境下golang如何通过swig调用C++ dll。由于编译c++代码使用了gcc,需要为DLL文件增加按照g++ name mangling的导出项。如果DLL导出了大量函数、类或变量,为DLL编写def文件是一项非常麻烦、无聊的事情。如果golang能够利用visual c++编译器来编译c++代码的话,或许不需要额外的def文件了,但是我用百度和谷歌浏览器进行了大量的搜索,没有找到相关的内容,即使是关于golang如何调用c++ DLL(load-time dynamic linking)的相关内容也没有。

为此,需要一个工具来自动生成def文件。这个工具解析DLL文件,利用一些工具和windows api来自动生成def文件,利用def文件再次编译DLL文件。编译后的DLL既可以被Golang调用也可以被C++调用。下面讲一下实现思路。

第一步需要按照PE规范来解析DLL,找到DLL的导出函数列表。实现这步有多种方法,可以用dumpbin  /EXPORT Simple.dll, 从命令输出的内容可以找到导出内容;golang "debug/pe"包提供了pe解析功能,很容易获取导入符号,要获取DLL的导出项还需要在该包的基础上继续解析PE;还可以利用github上的开源pe解析库,其中的一个 (https://github.com/trailofbits/pe-parse),IterExpVA以回掉函数的形式返回导出项。在我实现的工具中就使用了这个开源pe库。

第二步,将第一步返回的导出符号列表进行unmangling,得到函数的原始名称。同样有多种方法。可以用undname.exe,解析其输出内容。最好的方法是调用windows api,UnDecorateSymbolName提供了将decorated name还原到函数签名的功能,并且有很多可选项。

第三步,根据UnDecorateSymbolName得到的结果,推导函数或变量的签名,并给函数一个简单的实现,只提供{}即可。好在微软提供了这个api,否则比较难实现这个自动化工具。分别传入

UNDNAME_COMPLETE、UNDNAME_NAME_ONLY、(UNDNAME_NO_MS_KEYWORDS|undname2.UNDNAME_NO_ACCESS_SPECIFIERS),根据三次输出的结果即可推导。例如 CSimple::CSimple构造函数,

class CSimple{

CSimple(void);

};

CSimple::CSimple(void){}

第四步,对上步推导出的函数进行g++ name mangling,没有单独的工具能够做这件事情。只能借助g++预处理结果来找到mangled name。调用命令g++ -x c++ -S in.cpp -o out.txt

输出文件内容中,.globl对应mangled name。注意一个函数可能有多个导出,例如构造函数会有两个。

按照上面的思路去做,就可以创建这样一个自动化工具。

calling c++ from golang with swig--windows dll (四)的更多相关文章

  1. calling c++ from golang with swig--windows dll(一)

    calling c++ from golang with swig--windows dll 之前项目组开发的项目核心代码全部使用C++语言,新项目可能会引入golang,花了一天多时间研究了wind ...

  2. calling c++ from golang with swig--windows dll (三)

    calling c++ from golang with swig--windows dll 三 使用动态链接库(DLL)主要有两种方式:一种通过链接导入库,在代码中直接调用DLL中的函数:另一种借助 ...

  3. calling c++ from golang with swig--windows dll 二

    Name mangling && Name demangling 在讲述golang如何利用swig调用windows dll之前,需要了解一个概念:Name Mangling (或者 ...

  4. golang调用c++的dll库文件

    最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一.DLL 的编制与具体的编程语言及编译器无关 dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以 ...

  5. Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术

    catalogue 1. 引言2. 使用注册表注入DLL3. 使用Windows挂钩来注入DLL4. 使用远程线程来注入DLL5. 使用木马DLL来注入DLL6. 把DLL作为调试器来注入7. 使用c ...

  6. go 调用windows dll 的方法

    go 调用windows dll 的方法 ,代码如下: package main import ( "fmt" "syscall" "time&quo ...

  7. C#实现动态调用Windows DLL

    调用方法: object obj = WinDllInvoke("Kernel32.dll", "Beep", , }, typeof(void)); 函数代码 ...

  8. Creating Icon Overlay Handlers / 创建图标标记 Handlers (翻译自MSDN) / VC++, Windows, DLL, ATL, COM

    创建图标标记 Handlers Creating Icon Overlay Handlers 图标标记是放在代表着某个 Shell 对象的图标之左下角的小图像.它们通常被加在一个对象的图标的身上来提供 ...

  9. Windows DLL资料整理

    1.使用Visual C++ 6.0创建dll 2. 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 要点: 1. 如果你的程序中没有涉及可变参数,最好使 ...

随机推荐

  1. Java数据结构和算法(五)——队列

    前面一篇博客我们讲解了并不像数组一样完全作为存储数据功能,而是作为构思算法的辅助工具的数据结构——栈,本篇博客我们介绍另外一个这样的工具——队列.栈是后进先出,而队列刚好相反,是先进先出. 1.队列的 ...

  2. Centos 7 ip查看问题

    centos7已经没有ifconfig功能,现在使用的是命令ip addr查看,如果还是习惯ifconfig使用"yum -y install net-tools"命令进行安装 安 ...

  3. AngularJS ng-repeat使用及注意事项

    用法:ng-repeat="extension"; extension(表达式) 定义了如何循环集合. 表达式实例规则: 1. x in records 2. (key,value ...

  4. 如何在仅主机模式下ping通网路上网

    1 主机的控制面板,找到电脑的实际网卡,勾选,并选择VMware Network Adapter VMnet1 找到虚拟网卡VMware Virtual Ethernet Adapter for VM ...

  5. python爬虫入门--beautifulsoup

    1,beautifulsoup的中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 2, from bs4 import Be ...

  6. codeforces 893D Credit Card 贪心 思维

    codeforces 893D Credit Card 题目大意: 有一张信用卡可以使用,每天白天都可以去给卡充钱.到了晚上,进入银行对卡的操作时间,操作有三种: 1.\(a_i>0\) 银行会 ...

  7. 第七届C/C++B-方格填数 DFS

    方格填数 如下的10个格子    +--+--+--+    |  |  |  | +--+--+--+--+ |  |  |  |  | +--+--+--+--+ |  |  |  | +--+- ...

  8. 主流PHP框架间的比较(Zend Framework,CakePHP,CodeIgniter,Symfony,ThinkPHP,FleaPHP)

    Zend Framework 优点: Zend Framework大量应用了PHP5中面向对象的新特征:接口.异常.抽象类.SPL等等.这些东西的应用让Zend Framework具有高度的模块化和灵 ...

  9. So, you think you know JavaScript?

    Baranovskiy 参考:http://dmitry.baranovskiy.com/post/91403200   题目一:   if (!("a" in window)) ...

  10. python爬虫(七)_urllib2:urlerror和httperror

    urllib2的异常错误处理 在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个response,就产生错误. 这里主要说的是UR ...