例如,我可以将一组已编译成GCC-4.6的库与GCC-4.9混合使用.
我知道不同的编译器"品种"如VS不能与MinGW但可以不同代的同一编译器?问题可能会发生吗?如果是这样的话?
在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.
如何解释那些(冲突?)信息?
据我所知,文档中Android NDK中两种支持的ARM体系结构之间的区别仅在于支持的CPU指令集.真的是这样吗?调用约定,系统调用序列或其他内容没有区别吗?
我想知道如果我将模块编译为ARM对象文件(使用NDK以外的编译器 - 特别是Free Pascal),将ARMv6指定为架构,然后将其链接到armeabi和armeabi-v7a共享库,将会发生什么.除了通过我自己的基于C的接口之外,FPC位不应该既不执行系统调用也不执行Java调用.
编辑:一个hello world库,使用FPC for ARM编译,链接并在ARMv7a仿真器下运行.
我刚才注意到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(×2, argc);
assert(a == b);
return a;
}
Run Code Online (Sandbox Code Playgroud) clang ++和g ++是ABI不兼容的,即使对于像标准容器这样的核心东西,例如clang ++网站.
Debian附带了C++共享库,即libboost等...使用两种编译器编译的东西和用户程序通常都可以工作,并且库名称不会被用于它们的编译器损坏.当你安装clang时,debian不会去你系统上安装的每个C++库的重复版本.
这是怎么回事?clang与发行版提供的C++库链接的能力是否比编译器开发人员描述的那样强大(谢天谢地)?
在下面的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#,并试图使用《C# 10 in a Nutshell》一书来跟上进度。
\n作者在那里提到,将属性的访问器从 更改为init或set反之亦然是一个重大更改。我可以理解如何将其更改为set可能init是一个重大更改,但我只是无法理解为什么以其他方式更改它会是一个重大更改。
例如:
\n// Assembly 1\nTest obj = new(){A = 20};\n\n// Assembly 2\nclass Test\n{\n public int A {get; init;} = 10;\n}\nRun Code Online (Sandbox Code Playgroud)\n即使我将init属性访问器更改为.Assembly 1 中的此代码也不应受到影响set。那么为什么这是一个重大变化呢?
下载并编译了glibc-2.13.当我尝试运行一个执行malloc()的示例C程序时.我得到以下错误
elf file OS ABI invalid
任何人都可以通过我的任何指针帮助解决这个问题.请注意我的内核版本是linux-2.6.35.9
任何人都有参考va_listx86_64 ABI(在Linux上使用的那个)的表示?我正在尝试调试一些代码,其中堆栈或参数似乎已损坏,这将真正有助于理解我应该看到的内容......
来自维基百科:
在计算中,红色区域是函数堆栈帧中超出返回地址的固定大小区域,该区域不被该函数保留.被调用函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销.中断/异常/信号处理程序不会修改此内存区域.System V使用的x86-64 ABI要求一个128字节的红色区域,它直接在返回地址之后开始并包含函数的参数.OpenRISC工具链假设一个128字节的红色区域.
超出%rsp指向的位置的128字节区域被认为是保留的,不应被信号或中断处理程序修改.因此,函数可以将此区域用于函数调用不需要的临时数据.特别是,叶子函数可以将这个区域用于它们的整个堆栈帧,而不是调整序言和尾声中的堆栈指针.这个区域被称为红区.
鉴于这两个引号,堆叠的返回地址上方或堆叠的返回地址下方的红色区域 是?
由于这个红色区域是相对的RSP,它是否向下push移动并且每个区域向上移动pop?
abi ×10
c++ ×4
x86-64 ×3
assembly ×2
c ×2
linux ×2
android ×1
android-ndk ×1
apache-spark ×1
c# ×1
freepascal ×1
gcc ×1
gcc4.6 ×1
gcc4.9 ×1
glibc ×1
linux-kernel ×1
properties ×1
red-zone ×1
scala ×1
x86 ×1