calling c++ from golang with swig--windows dll (四)
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 (四)的更多相关文章
- calling c++ from golang with swig--windows dll(一)
calling c++ from golang with swig--windows dll 之前项目组开发的项目核心代码全部使用C++语言,新项目可能会引入golang,花了一天多时间研究了wind ...
- calling c++ from golang with swig--windows dll (三)
calling c++ from golang with swig--windows dll 三 使用动态链接库(DLL)主要有两种方式:一种通过链接导入库,在代码中直接调用DLL中的函数:另一种借助 ...
- calling c++ from golang with swig--windows dll 二
Name mangling && Name demangling 在讲述golang如何利用swig调用windows dll之前,需要了解一个概念:Name Mangling (或者 ...
- golang调用c++的dll库文件
最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一.DLL 的编制与具体的编程语言及编译器无关 dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以 ...
- Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术
catalogue 1. 引言2. 使用注册表注入DLL3. 使用Windows挂钩来注入DLL4. 使用远程线程来注入DLL5. 使用木马DLL来注入DLL6. 把DLL作为调试器来注入7. 使用c ...
- go 调用windows dll 的方法
go 调用windows dll 的方法 ,代码如下: package main import ( "fmt" "syscall" "time&quo ...
- C#实现动态调用Windows DLL
调用方法: object obj = WinDllInvoke("Kernel32.dll", "Beep", , }, typeof(void)); 函数代码 ...
- Creating Icon Overlay Handlers / 创建图标标记 Handlers (翻译自MSDN) / VC++, Windows, DLL, ATL, COM
创建图标标记 Handlers Creating Icon Overlay Handlers 图标标记是放在代表着某个 Shell 对象的图标之左下角的小图像.它们通常被加在一个对象的图标的身上来提供 ...
- Windows DLL资料整理
1.使用Visual C++ 6.0创建dll 2. 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 要点: 1. 如果你的程序中没有涉及可变参数,最好使 ...
随机推荐
- Java数据结构和算法(五)——队列
前面一篇博客我们讲解了并不像数组一样完全作为存储数据功能,而是作为构思算法的辅助工具的数据结构——栈,本篇博客我们介绍另外一个这样的工具——队列.栈是后进先出,而队列刚好相反,是先进先出. 1.队列的 ...
- Centos 7 ip查看问题
centos7已经没有ifconfig功能,现在使用的是命令ip addr查看,如果还是习惯ifconfig使用"yum -y install net-tools"命令进行安装 安 ...
- AngularJS ng-repeat使用及注意事项
用法:ng-repeat="extension"; extension(表达式) 定义了如何循环集合. 表达式实例规则: 1. x in records 2. (key,value ...
- 如何在仅主机模式下ping通网路上网
1 主机的控制面板,找到电脑的实际网卡,勾选,并选择VMware Network Adapter VMnet1 找到虚拟网卡VMware Virtual Ethernet Adapter for VM ...
- python爬虫入门--beautifulsoup
1,beautifulsoup的中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 2, from bs4 import Be ...
- codeforces 893D Credit Card 贪心 思维
codeforces 893D Credit Card 题目大意: 有一张信用卡可以使用,每天白天都可以去给卡充钱.到了晚上,进入银行对卡的操作时间,操作有三种: 1.\(a_i>0\) 银行会 ...
- 第七届C/C++B-方格填数 DFS
方格填数 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+- ...
- 主流PHP框架间的比较(Zend Framework,CakePHP,CodeIgniter,Symfony,ThinkPHP,FleaPHP)
Zend Framework 优点: Zend Framework大量应用了PHP5中面向对象的新特征:接口.异常.抽象类.SPL等等.这些东西的应用让Zend Framework具有高度的模块化和灵 ...
- So, you think you know JavaScript?
Baranovskiy 参考:http://dmitry.baranovskiy.com/post/91403200 题目一: if (!("a" in window)) ...
- python爬虫(七)_urllib2:urlerror和httperror
urllib2的异常错误处理 在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个response,就产生错误. 这里主要说的是UR ...