linux - Golang,在Linux中加载Windows DLL

标签 linux go dll system-calls

我们的 vendor 提供了可在 Windows 上运行的 DLL。是否可以使用 Go 加载自定义 xxx.dll 文件并在 Linux 中使用其功能?

像这样:https://github.com/golang/go/wiki/WindowsDLLs

最佳答案

简短的回答是“不”:当您“加载”动态链接库时,它不仅实际加载(如从文件中读取),而且链接到您的地址空间运行程序——通过操作系统提供的特殊方式(在基于 Linux 的系统上,至少在 x86/amd64 平台上是一个外部进程;在 Windows 上,它是一个内核设施,AFAIK)。 换句话说,加载动态链接库涉及在您背后发生的相当多的复杂性。

另一个复杂的问题是,DLL 是否是“独立的”,因为它只包含“纯”函数——这些函数只对输入数据执行计算以提供输出数据——或者它们调用操作系统执行诸如文件 I/O 之类的事件。 Windows 和 Linux 操作系统为正在运行的进程提供执行此类事件的方法的方式截然不同。

我能想到的最后一个复杂问题是这个库对其他库的依赖。 如果库的代码是用 C 或 C++ 编写的,它很可能取决于编译库的编译器使用的 C 库(在 Windows 上,通常是 MSVCRxx.DLL 东西)。 (一个简单的例子是在库代码中调用 malloc()printf() 或类似的东西。)

所有这一切意味着大多数在 Windows 上为 Windows 编写的 DLL 都依赖于 Windows 和与用于构建该库的编译器关联的 C 或 C++ 标准库。

更不用说 Windows DLL 为其模块使用 PE(可移植可执行文件)格式,而基于 GNU/Linux 的系统本身就为其共享目标文件使用 ELF 格式。

关于linux - Golang,在Linux中加载Windows DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46646826/

相关文章:

python - 在同一个套接字上监听时多个进程之间的巨大 CPU 时间差异

go - 使用 Go 使用 http/2 连接到 Alexa 语音服务时遇到问题

string - 如何用随机替换词有效地替换字符串中的词?

c# - 如何使C#COM类支持VB6中的参数化属性

wcf - 无法加载 DLL 'mqrt.dll'

linux - 如何将年转换为天(过去)?

linux - 如何使用 "top"仅提取 CPU 使用率和进程名称(命令)列?

c - 是否可以从 udp 服务器向客户端发送响应?

golang cgo : libevent handler values are set to null during execution

c++ - 如何在 C++ 中获取 DLL 文件的版本信息