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. 理解OC“属性”这一概念

    1.定义一个属性,编译器会自动编写相关的存取方法和实例变量,如果不想使用系统默认的实例变量,可以使用@synthesize(合成)语法来指实例变量的名字,如果不想编译器自动合成存取方法,则可以自己实现 ...

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

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

  3. bitcms 一个迟到的项目,一个老程序的项目总结

    经历长达两年的开发,两个版本的更换.bitcms要终于面世了.先来接受大家的吐嘈.项目文档,慢慢完善中... 首先先来介绍下项目 bitcms是由asp.net开发,sqlite为数据库的开源内容管理 ...

  4. springmvc关于前台日期作为实体类对象参数类型转换错误

    页面报错: 后台错误: Field error in object 'user' on field 'birthday': rejected value [2013-06-24]; codes [ty ...

  5. Atcoder R84 D Small Multiple

    题意:给定一个正整数K,求K的倍数中,各位上的数字之和最小是多少? 思路非常巧妙,对于一个数,我们有定义两种改变方式: 1.加1,则数字之和+1(9的情况另行考虑) 2.乘10,数字之和不变 对于末位 ...

  6. WPF水珠效果按钮组

    效果图 相关知识 这部分基本就是废话,网上都能找到,我只不过是整理了以下.建议先不看,用到的时候可以回来看看 贝塞尔曲线 先来看两组图,有助于理解什么是贝塞尔曲线(图片取自维基百科,参考链接1) 二次 ...

  7. Ansible - 简介和应用自动化基础实践

    installAnsible简介和应用自动化基础实践 一.引入: 1.1  如官方定义,Ansible is The simplest way to automate apps and IT infr ...

  8. 五.Spring与RabbitMQ集成--HelloWorld

    spring对RabbitMQ做了很好的集成,我们称之为spring AMQP,其官方文档写得十分详尽,文档地址:https://docs.spring.io/spring-amqp/referenc ...

  9. opensslBIO系列之2---BIO结构和BIO相关文件介绍

    BIO结构和BIO相关文件介绍     (作者:DragonKing Mail:wzhah@263.net 公布于:http://gdwzh.126.com openssl专业论坛)          ...

  10. 机房收费系统——转换list泛型时,字段名称不正确应出现故障

    因为之前对泛型研究了一番,所以就開始尝试着在机房收费系统重构中增加了泛型的使用. 可是到了做学生查看剩余金额这个功能的时候,还是依照之前的方法做的,可是在载入数据的时候班级这个框就没有显示出来--然后 ...