标签: binary-compatibility

Java - 抽象类和子类的二进制兼容性

在Java中,我定义了一个抽象类,其中包含具体和抽象方法,并且必须由第三方开发人员独立创建子类.只是为了确定:我是否可以对抽象类进行任何更改,这些更改与源类兼容,但不兼容二进制?换句话说:他们已经编制了各自的子类后,我能变抽象类 - 除了如增加一个抽象方法给它或移除它受保护的方法由子类,这是当然的源不兼容称为 - 的方式这可能会迫使他们重新编译他们的子类?

java binary-compatibility

6
推荐指数
2
解决办法
1053
查看次数

GCC 4.0,4.2和LLVM ABI兼容性

Xcode(gcc 4.0,4.2和llvm)支持的三种主要编译器风格是否是二进制兼容的?在使用最新的Xcode工具快速实现多库项目时,我应该注意哪些问题和角落案例?

xcode gcc llvm binary-compatibility

6
推荐指数
1
解决办法
2739
查看次数

纯虚函数和二进制兼容性

现在,我知道向非叶类添加新的虚函数通常是不好的,因为它破坏了尚未重新编译的任何派生类的二进制兼容性.但是,我的情况略有不同:

我有一个接口类和实现类编译成共享库,例如:

class Interface {
    public:
        static Interface* giveMeImplPtr();
        ...
        virtual void Foo( uint16_t arg ) = 0;
        ...
}

class Impl {
    public:
        ...
        void Foo( uint16_t arg );
        ....
}
Run Code Online (Sandbox Code Playgroud)

我的主应用程序使用这个共享库,基本上可以写成:

Interface* foo = Implementation::giveMeImplPtr();
foo->Foo( 0xff );
Run Code Online (Sandbox Code Playgroud)

换句话说,应用程序没有任何派生类Interface,它只是使用它.

现在,说我想重载Foo( uint16_t arg )Foo( uint32_t arg ),我是安全的这样:

 class Interface {
    public:
        static Interface* giveMeImplPtr();
        ...
        virtual void Foo( uint16_t arg ) = 0;
        virtual void Foo( uint32_t arg ) = 0;
        ...
} …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance binary-compatibility

6
推荐指数
3
解决办法
3381
查看次数

编写使用类的两个实现之一编译的Java代码

我正在用Java编写一些FFI代码,这些代码大量使用sun.misc.Unsafe.

在Java 9中,这个类将变得不可访问,并且将成为jdk.unsupported.Unsafe.我想编写我的代码,以便它现在可以工作,但继续在Java 9中工作.

最黑客的方法是什么?我更喜欢二进制兼容性,但源兼容性也没关系.

编辑:每次Unsafe调用方法时,我100%不能使用反射 - 甚至是虚拟调度.大多数这些方法都编译为单个机器指令.因此,性能真的很重要.拥有包装器是可以的 - 但只有当我确定JIT每次都会内联它们时才会这样.

我目前的计划是在运行时加载适当的类.

java ffi binary-compatibility source-compatibility

6
推荐指数
1
解决办法
157
查看次数

ARMv8 向后兼容 ARMv7(Snapdragon 820 与 Cortex-A15)

我看到 ARMv8 只是 ARMv7 架构的扩展,所有在 ARMv7 上编译的代码都应该在 ARMv8 上运行。我对 ARMv8 到 ARMv7 的向后兼容性感兴趣。在 ARMv8 上编译的代码能否在 ARMv7 上运行?

我有一个特别感兴趣的案例:我想在Nvidia Jetson TK1(NVIDIA Cortex-A15 CPU)上运行为OnePlus 3 智能手机(Qualcomm MSM8996 Snapdragon 820 CPU)编译的comma.ai 的 Openpilot 视觉二进制文件。有远见的人会在 Jetson 上运行吗?

编辑:可能有比 CPU 兼容性更多的问题,因为 Visiond 可能在该手机上大量使用 GPU。可能取决于他们是否使用一些标准的并行化方式(OpenCL、NEON 等)或者是否有一些用于 Snapdragons GPU 的自定义代码。即使使用 OpenCL,在不同硬件上兼容的可能性也可能很低。

arm cpu-architecture backwards-compatibility binary-compatibility armv8

6
推荐指数
1
解决办法
3772
查看次数

STL容器的二进制兼容性

假设我用C++编写了一个DLL,并希望导出一个带有std :: vector参数的方法.我希望不同STL版本之间的任何二进制兼容性吗?

c++ stl binary-compatibility

5
推荐指数
2
解决办法
1340
查看次数

添加属性时,如何保留.NET程序集的COM二进制兼容性?

我们开发了一个存储语言翻译信息的.NET程序集,它需要由VB6应用程序使用.

我们希望能够更改翻译信息,而无需重新编译应用程序.

翻译由名为LanguageServices的双文件分部类提供.

一个文件是不变的库方法,另一个是来自resx文件的所有自动生成的属性,并且regx是从语言翻译信息的数据库生成的.

这一切都源于需要拥有一个翻译的中央数据库,这些数据库可以编程"扁平化"为我们每个不同应用程序可以使用的格式.

现在,我可以通过绕过它并以不同的方式来解决这个问题.事实上,我可以摆脱自动生成的属性列表,问题就会消失.

我感兴趣的是如何解决这个问题,因此:

如果我们向数据库添加新的翻译标签(这个字中的这个字变成了那个字),它会向类添加新的属性,这又为COM接口添加了新的公开属性.

这些属性被添加到COM接口的中间,从而破坏了二进制兼容性.它们被添加到中间,因为C#编译器使用分部类的静态部分为部分类的动态部分添加后缀.我需要做的是以相反的方式连接它们或者在C#文件本身中明确说明顺序.我认为在类的静态部分显式设置DispID会做到这一点,但事实并非如此.

以下是构建过程生成的一对IDL文件:

这是我添加新属性之前的IDL.

http://pastebin.com/qPvcUV9z

以下是添加新属性并且兼容性被破坏后的IDL:

http://pastebin.com/K2MuqtYV

确切的区别是这个位置被推到中间:

[id(0x60020039), propget]
HRESULT Jn_ExactCaseMatch([out, retval] VARIANT_BOOL* pRetVal);
[id(0x6002003a), propget]
HRESULT Jn_Regex([out, retval] VARIANT_BOOL* pRetVal);
[id(0x6002003b), propget]
HRESULT Jn([out, retval] BSTR* pRetVal);
Run Code Online (Sandbox Code Playgroud)

认为这是问题,它改变了方法的顺序.我认为可以通过显式定义DispID来覆盖订单(您可以看到从头HRESULT Culture([in] ICultureInfo* pRetVal);开始的所有内容都有一个从0开始的id.

这是编写/生成的C#代码:ILanguageServices.cs:自动生成的界面.

[Guid("547a7f6e-eeda-4f77-94d0-2dd24f38ba58")]
public partial interface ILanguageServices
{
    /// <summary>
    /// 
    /// </summary>
    System.Boolean Offence_ExactCaseMatch { get; }

    /// <summary>
    /// 
    /// </summary>
    System.Boolean Offence_Regex { get; }

    /// <summary>
    /// 
    /// </summary>
    string Offence { get; …
Run Code Online (Sandbox Code Playgroud)

c# com interop binary-compatibility

5
推荐指数
1
解决办法
1635
查看次数

ARMv4/5/6代码的哪些部分不适用于ARMv7?

据我所知,ARMv7处理器(如Cortex-A9)大多向后兼容旧版ARM架构版本的代码.但是,我已经阅读过有关尝试在Cortex-A8上运行ARM9代码的段错误的报告.

ARMv4/5/6(ARM7TDMI/ARM9/ARM11)代码的哪些部分在ARMv7处理器上不起作用?这些较旧的ARM体系结构版本中存在哪些功能或体系结构特征可能导致为这些版本构建的程序在ARMv7上失败?

arm cpu-architecture backwards-compatibility binary-compatibility

5
推荐指数
1
解决办法
4211
查看次数

确定linux下的二进制兼容性

确定预编译二进制文件的依赖项(特别是关于 glibc 和 libstdc++ 符号和版本)然后确保目标系统安装了这些依赖项的最佳方法是什么?

我有一个限制,我不能提供在每台机器上编译的源代码(雇主限制),所以“在每台机器上编译以确保兼容性”的实际响应是不合适的。我也不希望提供静态编译的二进制文件 -> 似乎是使用锤子打开鸡蛋的情况。

我已经考虑了许多方法,这些方法大致围绕确定我的可执行文件/库需要的符号/库通过使用诸如ldd -v </path/executable> or 之类的命令 objdump -x </path/executable> | grep UND ,然后以某种方式在目标系统上运行命令以检查是否提供了此类符号、库和版本(不完全确定我如何执行此步骤?)。然后将跟随一些模式或符号匹配以确保存在正确的版本或更高版本。

也就是说,我觉得这已经在很大程度上为我完成了,我正在遭受......“知识差距?” 它目前是如何实施的。

关于如何进行的任何想法/建议?

我应该补充一点,这是为了在各种 linux 发行版上安装我的软件 - 特别是定制的集群 - 可能不遵守发行指南或标准化的打包方法。目标是无缝安装。

linux glibc binary-compatibility

5
推荐指数
1
解决办法
3339
查看次数

内联命名空间可以用来保持共享库的向后兼容性吗?

C++ 内联命名空间的基本原理是源代码和二进制兼容性(请参阅N2535中链接的 Herb Sutter 的论文),但在引入内联命名空间时,或者如果可能的话,我无法找到保持现有库的二进制兼容性的好示例。

(有关更多信息以及源兼容性的示例,请参阅此问题

(为了解决相关问题,使用内联命名空间引入不兼容,请参阅这个问题

如果这是我们当前的库(例如 mylib.dll),与客户端共享并且需要稳定:

struct ModelA
{
   /* (...) lots of stuff */
};

struct ModelB
{
   /* (...) lots of stuff */
};
Run Code Online (Sandbox Code Playgroud)

我们是否可以使用内联命名空间引入新版本的结构/类而不破坏客户端(即仅替换共享库文件(mylib.dll),无需重新编译)?

inline namespace mylib
{

inline namespace v1
{
struct ModelA
{
   /* (...) lots of stuff */
};
} // end namespace v1

namespace v2
{
struct ModelA
{
   /* (...) lots of stuff + newstuff */
};
} // end namespace …
Run Code Online (Sandbox Code Playgroud)

c++ abi binary-compatibility c++11

5
推荐指数
1
解决办法
582
查看次数