2403d,d解析c++符号

原文

这里有个简单的无需更改动态库或应该动态链接到它的DMD项目中源码的方法.当然,并不能解决潜在C++调用约定问题(C不存在),但可在有它们时再调查.

我做了个小小的概念证明,它有效.为了具体起见,假设动态库libx.dll,使用安装了最新MSYS2(mingw64)gcc构建它,因为这是我需要的所有工具bash命令行.

假设构建时,DMD项目为可执行文件,并从main.dother.d及包含使用libx.dll必要声明的D的header.di接口文件,编译至main.exe.

因为libx.dll是从C源码编译的,而不是从C++编译的,假设暂时没有混杂问题.

要从DMDmain.exe可执行文件动态链接libx.dll.
在构建main.exe时,DMD需要链接implib(导入库),且可从def文件(模块定义文件)创建此类文件,使用了解DMD所在的MSVC世界的库管理器.

libx.deflibx.dlldef文件,让libx.lib成为libx.dllimplib文件.

链接libx.dll时,一般由gcc-Wl,--output-def=libx.def创建def文件.且可用与该mingw64的gcc一起分发的dlltool创建一个implib.

$ dlltool -D libx.dll -d libx.def -l libx.lib -m i386:x86-64

或,可用微软lib工具:

$ lib -nologo -machine:x64 -def:libx.def -out:libx.lib

现在,构建main.exe时,只需要链接该导入库,就可工作了.

$ dmd main.d other.d header.di libx.lib
$ ./main #works

现在假设转向C++.如果如上创建导入库,则不会链接main.exe构建,因为impliblibx.lib中的gcc混杂名与DMD提供的MSVC混杂名不匹配.

可修改def文件,并生成一个包含MSVC混杂名的implib,来代替相应的gcc混杂名来解决该问题!

implib包含要链接到的每个名字,及该名所引用函数在动态库中的相应位置.即,libx.lib包含每个gcc混杂名,及相应函数在libx.dll中的位置.

因此,如果用impliblibx.lib中相应的MSVC混杂名替换gcc混杂名,则问题就解决了.
有很多方法可完成!但是,def文件中有个机制这里可完成.

这是由如下命令生成的玩具libx.dlldef文件libx.def.

//命令
g++ -shared libx.o -o libx.dll -Wl,--output-def=libx.def
//`libx.def`
EXPORTS_Z11complicatedi @1

这里_Z11complicatedi@1int complicated(int)gcc混杂.可惜,other.d期望按?complicated@@YAHH@Z混杂该函数,因为这是int __cdecl complicated(int)MSVC混杂,并来自在header.di中的extern(C++)int complicated(int);.

Editing libx.def into
EXPORTScomplicated@@YAHH@Z=_Z11complicatedi @1

生成impliblibx.lib时,按右侧的gcc混杂名替换混杂左侧的MSVC名.如前使用MSlib工具,并构建main.exe消除了链接错误,就可以了.

但是,虽然如前使用dlltoolllvm-dlltool会产生满足链接器的implib,但运行时生成的main.exe玩具示例中没有作用,只是返回到提示符,截至2024-02-29没有输出.

main.exelibx.dll,可在def文件中机械地生成包含许多替换行的libx.deflibx.lib.或libx.deflibx.lib可在编写DMD项目时使用新符号动态重建.

使用MSdumpbin工具可生成文本,从中可提取MSVC混杂符号及解混杂.
因此,如果使用-lib选项来把DMD项目编译为库,以便在链接中断生成它,则可通过在生成的main.lib上运行dumpbin撕毁生成的文本来,自动构造用来链接的(解混杂,MSVC混杂)名对表.

类似地,nm工具可用来从libx.dll生成(解混杂,gcc混杂)对的表,并结合libx.def文本,如上例所示,来生成修改后的libx.def和必要的附加限定符.

脚本也可这样,然后运行lib以在构建过程动态构建导入库.或,如果在D头文件中已有库的绑定,比如header.di,则它可一劳永逸地生成包含未混杂名MSVC混杂名对,然后用相应的libx.def文件生成与libx.dll一起使用的impliblibx.lib.

这里有很多可能性!
原则上可仅使用nm来制作替换def文件来转储MSVC混杂的二进制文件,因此不需要MS工具来制作它.

我刚刚发现DMD带有MSVC篡改名的dde混杂.exe.
取消它:dde混杂仅根据D混杂名而不是MSVC的方式解混杂.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

闭包的理解和使用场景

文章目录 一、是什么二、使用场景柯里化函数使用闭包模拟私有方法其他 三、注意事项 一、是什么 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组…

2024-03-10 c++

🌸 MFC下拉框控件 | Combo Box eg 计算器 1。新建MFC项目(基于对话框、静态库) 2。添加控件,删除初始的3个多余控件 加3个edit control 加1个combo box,属性sort改为false,data为 ;-;;;% 加1个static text…

数据可视化引领工业智能化时代的浪潮

随着工业数字化的迅速发展,数字孪生技术作为一项新兴技术,正日益受到工业界的关注和应用。数字孪生是将实际物理对象或过程与其数字化模型相连接的先进技术。通过数字孪生,工业企业可以在虚拟世界中模拟和测试现实世界的产品和生产过程&#…

C++ 指针和引用引用详解

C 指针和引用是两种非常重要的概念,它们在内存操作中起着至关重要的作用。在这篇文章中,我们将深入探讨C指针和引用的基本概念、分类、转换方法、应用场景以及相关的问题与陷阱。 1. 指针的基本概念和分类 1.1 指针的概念 指针是一个变量,…

「CISP考试1000题精讲」CISP练习题中的6道题精讲

第一题 Kerberos 协议是一种集中访问控制协议。它能在复杂的网络环境中,为用户提供安全的单点登录服务。单点登录是指用户在网络中进行一次身份认证,便可以访问其授权的所有网络资源,而不再需要其他的认证过程,实质是消息 M 在多个应用系统之间的传递或共享。其中消息 M 是…

js 添加、删除DOM元素

1. js添加、删除DOM元素 1.1. 添加DOM元素 1.1.1. appendChild()方法 该方法添加的元素位于父元素的末尾,使用方法: parentNode.appenChild(NewNode) // parentNode是需要添加元素的容器,NewNode是新添加的元素   创建一个li元素并添加到…

系统分析师论文总结【持续更新】

2024年3月4日,新的软考规则出来,高项改为一年一次,架构师改为一年两次。 下半年考试安排,如下图(来源官网) 收集整理系统分析师论文,方便备查。 一、2010年论文 1、论软件维护及软件课维护性…

【STM32】HAL库 CubeMX 教程 --- 高级定时器 TIM1 定时

实验目标: 通过CUbeMXHAL,配置TIM1,1s中断一次,闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列: 所有 TIM 的时钟频率都是72MHz;F103C8不带基本定时器,F103RC及以上才带基本定时器。…

现代DevOps如何改变软件开发格局

在软件开发的早期,该过程通常是开发人员编写代码,再将其交给质量保证(QA)进行测试。这种瀑布开发方法可能会导致质量问题和延迟,因为问题是在周期后期发现的。 一、了解DevOps和测试左移 DevOps是Development和Opera…

汉字转拼音

汉字转拼英——简单实现 依赖 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version> </dependency>汉字转拼音方式1&#xff1a; import net.sourceforge.pinyin4j.Pin…

CloudStack 中 op_host_capacity 表中的 capacity_type 取值详解

在 Apache CloudStack 中&#xff0c;op_host_capacity 数据表是用于记录云平台中主机资源容量的关键表之一。该表中的 capacity_type 字段是一个重要的属性&#xff0c;它标识了不同类型的基础架构资源。下面我们将详细解析 op_host_capacity 表中 capacity_type 的各种取值及…

2k_Day2:今天是springMVC和mybatisPlus的大白话

1.我感觉&#xff0c;springboot把配置搭好了&#xff0c;就能写业务增删改查&#xff0c;然后盯好dao、service、impl、controller就好了&#xff0c;其他的事&#xff0c;用到时才会再去配置&#xff0c;不是吗&#xff1f; 2.使用mybatisplus时&#xff0c;它有很多方法&am…

解决Gradle下载过慢问题的有效方式:使用国内镜像站点

前言 在开发过程中&#xff0c;我们经常会遇到Gradle下载速度缓慢或超时的问题。作为一个强大而流行的构建工具&#xff0c;Gradle是许多项目中必不可少的一部分。然而&#xff0c;由于官方下载地址可能受网络限制影响&#xff0c;导致下载速度较慢。针对这个问题&#xff0c;…

【题解】—— LeetCode一周小结10

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结9 4.用栈实现队列 题目链接&#xff1a;232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a…

基于ACM32 MCU的电动滑板车方案了,助力低碳出行

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

springboot集成 mongodb以及mongodb简单工具类

前言 springboot集成 mongodb 有开箱即用的starter 因此集成还是很方便的 集成 添加依赖 <!--mongodb--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </d…

【APP逆向】酒仙网预约茅台程序,包含逆向过程详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:爬虫实战,零基础、进阶教学 景天的主页:景天科技苑 文章目录 酒仙网预约抢购茅台1.抓包分析,账户名和密码登录2.短信登录3.登录+茅台预约 密码登录酒仙网预约抢购茅台 目标:账号登…

退磁曲线方形度Q与膝点Hk

大家都知道衡量钕铁铁磁体性能的指标包括剩磁Br、矫顽力HcB、内禀矫顽力HcJ和最大磁能积(BH)max&#xff0c;除此之外&#xff0c;内禀曲线方向度和Hk也是磁应用工程师非常关注的两个指标&#xff0c;今天就来了解一下这两个指标的含义及影响因素。 首先我们先来回顾一下什么是…

数据库备份脚本嘎嘎香,被秀到了!

1.Oracle RMAN备份 1.1 创建目录 [oracleOEL7 ~]$ mkdir -p /u01/dbbak/script [oracleOEL7 ~]$ cd /u01/dbbak [oracleOEL7 ~]$ chown -R oracle:oinstall script[oracleOEL7 ~]$ mkdir -p /u01/dbbak/db [oracleOEL7 ~]$ mkdir -p /u01/dbbak/arch [oracleOEL7 ~]$ cd /u01…

In-Memory Key-Value Store Live Migration with NetMigrate——泛读笔记

FAST 2024 Paper 论文阅读笔记整理 问题 分布式键值存储需要在节点之间频繁迁移键值碎片&#xff0c;以对动态工作负载变化做出反应&#xff0c;从而实现负载平衡、数据局部性和服务弹性。 现有方法局限性 现有的实时迁移技术必须假设一个或多个位置作为主查询服务点&#…