标签: abi

你能混合使用同一编译器的不同版本编译的c ++吗?

例如,我可以将一组已编译成GCC-4.6的库与GCC-4.9混合使用.

我知道不同的编译器"品种"如VS不能与MinGW但可以不同代的同一编译器?问题可能会发生吗?如果是这样的话?

c++ gcc abi gcc4.6 gcc4.9

23
推荐指数
1
解决办法
1万
查看次数

将Scala 2.12与Spark 2.x一起使用

在Spark 2.1 文档中提到了这一点

Spark运行在Java 7 +,Python 2.6 +/3.4 +和R 3.1+上.对于Scala API,Spark 2.1.0使用Scala 2.11.您需要使用兼容的Scala版本(2.11.x).

在Scala 2.12 发布消息时,它还提到:

尽管Scala 2.11和2.12主要是源兼容的,以便于交叉构建,但它们不是二进制兼容的.这使我们能够不断改进Scala编译器和标准库.

但是当我构建一个超级jar(使用Scala 2.12)并在Spark 2.1上运行它时.一切都很好.

我知道它不是任何官方消息来源,但在47度博客中他们提到Spark 2.1确实支持Scala 2.12.

如何解释那些(冲突?)信息?

scala abi binary-compatibility apache-spark

23
推荐指数
1
解决办法
1万
查看次数

armeabi和armeabi-v7a之间的区别

据我所知,文档中Android NDK中两种支持的ARM体系结构之间的区别仅在于支持的CPU指令集.真的是这样吗?调用约定,系统调用序列或其他内容没有区别吗?

我想知道如果我将模块编译为ARM对象文件(使用NDK以外的编译器 - 特别是Free Pascal),将ARMv6指定为架构,然后将其链接到armeabi和armeabi-v7a共享库,将会发生什么.除了通过我自己的基于C的接口之外,FPC位不应该既不执行系统调用也不执行Java调用.

编辑:一个hello world库,使用FPC for ARM编译,链接并在ARMv7a仿真器下运行.

android freepascal cpu-architecture abi android-ndk

22
推荐指数
1
解决办法
4万
查看次数

哪些平台的C和C++ ABI不兼容?

我刚才注意到C++标准说C和C++函数有不同的和不兼容的类型,即使它们的类型签名是相同的(更多信息请参阅这个问题).这意味着您在技术上不允许将C++函数传递给C函数pthread_create().

我很好奇是否有任何平台在使用两个ABI实际上是不同的(除了显而易见的名称差异).具体来说,有没有人知道这个C++程序无法编译和运行的任何平台?

#include <assert.h>

extern "C" int run(int (*f)(int), int x) { return f(x); }

int times2(int x) { return x * 2; }

int main(int argc, char *argv[]) {
  int a = times2(argc);
  // This is undefined behavior according to C++ because I am passing an
  // "extern C++" function pointer to an "extern C" function.
  int b = run(&times2, argc);
  assert(a == b);
  return a;
}
Run Code Online (Sandbox Code Playgroud)

c c++ abi

22
推荐指数
1
解决办法
546
查看次数

如果clang ++和g ++是ABI不兼容的,那么二进制文件中的共享库使用了什么?

clang ++和g ++是ABI不兼容的,即使对于像标准容器这样的核心东西,例如clang ++网站.

Debian附带了C++共享库,即libboost等...使用两种编译器编译的东西和用户程序通常都可以工作,并且库名称不会被用于它们的编译器损坏.当你安装clang时,debian不会去你系统上安装的每个C++库的重复版本.

这是怎么回事?clang与发行版提供的C++库链接的能力是否比编译器开发人员描述的那样强大(谢天谢地)?

c++ shared-libraries abi

22
推荐指数
2
解决办法
3560
查看次数

为什么这个函数将RAX作为第一个操作推送到堆栈?

在下面的C++源代码的汇编中.为什么RAX被推入堆栈?

正如我从ABI理解的那样,RAX可以包含来自调用函数的任何内容.但是我们将它保存在这里,然后将堆栈移回8个字节.所以堆栈上的RAX,我认为只与std::__throw_bad_function_call()操作相关......?

代码:-

#include <functional> 

void f(std::function<void()> a) 
{
  a(); 
}
Run Code Online (Sandbox Code Playgroud)

gcc.godbolt.org使用Clang 3.7.1 -O3 输出:

f(std::function<void ()>):                  # @f(std::function<void ()>)
        push    rax
        cmp     qword ptr [rdi + 16], 0
        je      .LBB0_1
        add     rsp, 8
        jmp     qword ptr [rdi + 24]    # TAILCALL
.LBB0_1:
        call    std::__throw_bad_function_call()
Run Code Online (Sandbox Code Playgroud)

我确定原因很明显,但我很难弄清楚.

这是一个没有std::function<void()>包装器的尾部调用,用于比较:

void g(void(*a)())
{
  a(); 
}
Run Code Online (Sandbox Code Playgroud)

琐碎的:

g(void (*)()):             # @g(void (*)())
        jmp     rdi        # TAILCALL
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly x86-64 abi

22
推荐指数
3
解决办法
2098
查看次数

为什么将属性从“init”更改为“set”是二进制破坏性更改?

时隔很长一段时间,我又回到了 C#,并试图使用《C# 10 in a Nutshell》一书来跟上进度。

\n

作者在那里提到,将属性的访问器从 更改为initset反之亦然是一个重大更改。我可以理解如何将其更改为set可能init是一个重大更改,但我只是无法理解为什么以其他方式更改它会是一个重大更改。

\n

例如:

\n
// Assembly 1\nTest obj = new(){A = 20};\n\n// Assembly 2\nclass Test\n{\n   public int A {get; init;} = 10;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

即使我将init属性访问器更改为.Assembly 1 中的此代码也不应受到影响set。那么为什么这是一个重大变化呢?

\n

c# properties abi

22
推荐指数
2
解决办法
1566
查看次数

glibc:elf文件OS ABI无效

下载并编译了glibc-2.13.当我尝试运行一个执行malloc()的示例C程序时.我得到以下错误 elf file OS ABI invalid

任何人都可以通过我的任何指针帮助解决这个问题.请注意我的内核版本是linux-2.6.35.9

linux glibc abi linux-kernel

21
推荐指数
2
解决办法
4万
查看次数

x86_64 va_list结构的格式是什么?

任何人都有参考va_listx86_64 ABI(在Linux上使用的那个)的表示?我正在尝试调试一些代码,其中堆栈或参数似乎已损坏,这将真正有助于理解我应该看到的内容......

c linux x86-64 abi variadic-functions

20
推荐指数
2
解决办法
1万
查看次数

x86-64上的红色区域究竟在哪里?

来自维基百科:

在计算中,红色区域是函数堆栈帧中超出返回地址的固定大小区域,该区域不被该函数保留.被调用函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销.中断/异常/信号处理程序不会修改此内存区域.System V使用的x86-64 ABI要求一个128字节的红色区域,它直接在返回地址之后开始并包含函数的参数.OpenRISC工具链假设一个128字节的红色区域.

System V x86-64 ABI:

超出%rsp指向的位置的128字节区域被认为是保留的,不应被信号或中断处理程序修改.因此,函数可以将此区域用于函数调用不需要的临时数据.特别是,叶子函数可以将这个区域用于它们的整个堆栈帧,而不是调整序言和尾声中的堆栈指针.这个区域被称为红区.

  • 鉴于这两个引号,堆叠的返回地址上方或堆叠的返回地址下方红色区域 是?

  • 由于这个红色区域是相对的RSP,它是否向下push移动并且每个区域向上移动pop

assembly x86-64 abi calling-convention red-zone

20
推荐指数
2
解决办法
2331
查看次数