2017-07-06 30 views
0

内调用原稿假设有一个特殊的硬件可以使 某些标准库的功能更快。更换Golang标准软件包并在

硬件可能存在与否。

我可以编写一个软件包,它可以像使用标准硬件一样使用此功能签名,但它会强制所有应用程序和其他软件包根据硬件的可用性决定要导入的软件包具体目标。在编译时和所有应用程序和包中的代码修改。

理想情况下,我更愿意决定在运行时使用哪个包,而不需要应用程序更改其导入。

该软件包将检查硬件的可用性,并使用它或执行标准功能。

有没有办法实现它?

“截取”标准包函数调用的其他方法?

+0

你的意思是注入或钩入二进制代码像JIT? – mattn

+0

由于这个原因,您的问题值得投票结束:“太广泛了:请编辑该问题,将其限制为具有足够详细信息的特定问题以确定合适的答案。”例如,你想要Intel SSE4吗?你想要ARM浮点吗?或者是什么? – peterSO

+0

@peterSO我不认为细节很重要,OP只是想知道这个机制是什么。该机制与您所针对的特定硬件无关。 – Adrian

回答

-1

这听起来像你正在谈论一个将被其他应用程序使用的库。你不能(很庆幸)以这种方式修改标准库 - 否则只是导入一个软件包可能会有令人难以置信的广泛和潜在的灾难性副作用。如果您想对标准库应用一些特殊的硬件特定优化,以供其他人在广泛的项目中使用,最好的办法是make your changes to the standard library and submit a patch

+0

硬件不够通用,不足以证明包含在标准库中。然而,它为那些拥有它的人提供了宝贵的改进。问题在于,我正在改进的这一部分与实际应用程序之间还有许多其他库。其中一些将是特定于应用程序的。应用程序编写者更改所有这些都很复杂。这就是为什么我试图看看是否有办法在两者之间“挂钩”。考虑一下LD_PRELOAD以及备用内存堆管理器如何挂接而不需要应用程序编写者更改其所有malloc调用。 – GreyBit

+0

没有。 LD_PRELOAD基于共享库,而Go stdlib静态链接到最终的二进制文件。 – Adrian

+0

很明显,LD_PRELOAD由于静态链接而无法在这里工作。问题是,是否有任何其他机制,构建或运行时,允许拦截对特定标准库的调用而不更改所有其他使用它的库。它不必对应用程序编写器完全透明,可能需要额外的步骤,只是不应对使用此特定标准库的所有内容进行深入更改。 – GreyBit