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. ##3.Keystone 验证服务--openstack

    ##3.Keystone 验证服务 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html #SQL上创建数据库并授权 #K ...

  2. nginx+tomcat安装配置

    nginx+tomcat安装配置 # nginx+tomcat安装配置 #创建网站目录 mkdir -p /www/wwwroot cd /www #安装配置 wget http://mirrors. ...

  3. 初窥c++11:lambda函数及其用法

    转载于:点击打开链接 为什么需要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名.1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值.正因为有这样的需求 ...

  4. 匈牙利标记法定义ECMAScript变量前缀

    匈牙利标记法定义ECMAScript变量前缀 类型 前缀 示例 数组 a aArray 布尔型 b bMale 浮点型(数字)   f fTax 函数 fn fnSwap 整型(数字) i iAge ...

  5. 阿里安全潘多拉实验室首先完美越狱苹果iOS 11.2

    苹果官方对iOS 11的评价是"为iPhone带来巨大进步,让iPad实现里程碑式飞跃."但为了不断修复Bug,苹果于12月2日推出最新的iOS 11.2,修复了Google安全人 ...

  6. POJ 2195Going Home(网络流之最小费用流)

    题目地址:id=2195">POJ2195 本人职业生涯费用流第一发!!快邀请赛了.决定还是多学点东西.起码碰到简单的网络流要A掉.以后最大流费用流最小割就一块刷. 曾经费用流在我心目 ...

  7. 【Espruino】NO.12 加速度传感器演示

    http://blog.csdn.net/qwert1213131/article/details/31035403 本文属于个人理解,能力有限,纰漏在所难免.还望指正! [小鱼有点电] [Espru ...

  8. 基于Handler架构的录音程序

    近期我的app须要一个录音功能,于是搜到这篇文章 文章中录音线程与主线程间的通讯是通过内部类訪问外部类成员变量的方式来实现 while (isRecord == true) { //isRecord是 ...

  9. 假设不小心改动了系统SDK文件,编译无法通过改怎么办?(iOS开发)

     project报例如以下错误: fatal error: file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimul ...

  10. 你懂AI吗(1)

    那场载入史册的战争之后,AI成为地球的主人已经快一个世纪了. 随着见证这场战争的那一代人基本消失,除了几个要堵上人类的尊严,颠覆AI的邪恶统治的组织外,现在的人基本已经习惯了这个AI统治的世界. AI ...