Articles of abi

在x86-64调用约定中返回值

如果我写一个返回void的函数,根据x86-64公约调用可以破坏rax / eax? 一个类似的问题关于一个函数返回一个double(因为真正的回报会发生在xmm0) 如果我做movq xmm0 – > rax。 然后我得到一个可以提供的号码 union { int, double }; 通过int。 那么当我通过双重阅读时,我得到了双倍的预期。 我的行为有什么缺陷?

为什么工具链名称具有单独的操作系统和EABI字段?

例如。 arm-unknown-linux-gnueabi现在,一旦操作系统即Linux被修复,C库将被固定(GLibc),因此被调用的约定和ABI将被修复。 第四个领域即ABI的要求是什么? 工具链可以使用底层操作系统和LIBC使用的不同ABI。 在那种情况下,由该工具链编译的库如何在OS上运行?

Linux,在一台主机上编译一段代码,在另一台主机上运行?

代码是用c / c ++编写的,可以依赖编译主机中的一些库; 它应该运行在另一个主机没有库取决于问题。 两台主机都是linux,可能有不同的版本。 你有一个好的策略?

在没有堆栈的情况下在Linux上进行系统调用

在Linux i386上, int $0x80系统调用ABI可以很容易地执行系统调用而不需要有效的用户空间栈。 另一方面,vdso / vsyscall接口需要访问堆栈。 其他Linux端口如何在这方面,特别是x86_64? 他们有办法让系统调用没有堆栈? 是否有可用的系统调用每个拱门的方法?

Linux内核模块ABI(x86)

我正在寻找用于在x86上的内核模块中调用ABI的官方定义。 我最近看了一个编译模块,惊讶地发现: 它使用寄存器来传递前三个参数( eax , edx和ecx )。 它不像GCC文档中描述的那样fastcall 。 文档说 fastcall使用ecx和edx(微软风格)。 我能find的唯一有点相关的信息就是这个 ,但是这个信息并不多。 所以: 1)是否有内核模块中使用的ABI官方文档(不是系统调用ABI,而不仅仅是函数列表 – 我find了)。 2)编译器产生这个奇怪的fastcall是怎么回事? 有没有我错过的开关?

必须重新编译运行x32 ABI应用程序的内容?

我可以使用新的x32 ABI编译应用程序,然后在正常的内核中运行它吗? 运行时C库怎么样? 与预编译的x86 / x86_64库有任何forms的互操作性吗?

G ++ ABI兼容性列表

我已经在Ubuntu服务器上编译了预加载文件(x32和x64有两个文件)。 在哪里我可以得到列表,我将看到什么操作系统我的编译文件兼容,以及我应该重新编译的兼容性? 谢谢!

针对特定的glibc ABI

我想在Linux上编译一个dynamic链接的可执行文件,我想要定位一个老的glibc ABI,以确保它可以在尽可能多的Linux计算机上运行。 我知道典型的解决scheme是使用chroot或虚拟机,安装一个旧的工具链,让工具链自然地指向一个老的glibc ABI,但是我想知道是否有一种方法可以明确告诉编译器:“嘿,我希望你依赖版本GLIBCXX_3.4.11“。 谢谢!

没有libstdc ++的C ++ RTTI。 可能吗?

我想调查一下如何在不使用libstdc ++的情况下链接C ++程序,但支持rtti。 我试图按照下面描述的方式进行编译。 任何必要但缺席的符号,我可以在例子中定义像函数strcmp,但是有没有可能定义typeinfo符号没有明确的mangle / demangle魔术? 如果可能的话如何? cd /tmp && cat << 'eof' >rtti.cpp && g++ -nodefaultlibs -lc rtti.cpp extern "C" int strcmp(const char *s1, const char *s2) { return 0; }; #include "typeinfo" int main(){ return typeid(int) == typeid(char); } Linker说: /tmp/cc6rBAef.o:在函数`main'中: rtti.cpp:(.text+0x18): undefined reference to `typeinfo for char' rtti.cpp:(.text+0x1d): undefined reference to […]

使用C ++ 11与GCC 4.8默认会导致链接错误与私有inheritance和提升

前言 使用我目前无法分解成一个MCVE的大部分代码,所以我会尽我所能。 问题 我正在编译为一个静态库libfoo.a的大型项目。 一个单独的项目, bar ,链接到该库。 libfoo的“冒犯”片段如下: class Base { public: void foo(){} void bar(){} }; class Derived : private Base { public: using Base::foo; }; libfoo和bar都大量使用boost 。 bar必须用-std=c++11编译,因为它使用了C ++ 11的特性,但是libfoo可以用最less的选项编译(即-std=c++0x GCC v4使用的默认编译器选项.8 ,看起来是-std=gnu++03 )。 当我尝试使用-std=c++0x GCC链接bar GCC默认编译了libfoo.a ,它会失败并显示冗长的名称错误警告, Undefined reference to Base::Derived::foo() 当我用-std=c++11重新-std=c++11 libfoo.a时,这个问题不再发生。 迄今为止工作 我通过nm比较了libfoo.a的输出,并且在这两种情况下都存在相应的符号。 我也通过了Cxx11Abi兼容性文档 ,并且这个编译器设置不应该“破坏”兼容性。 题 这个链接器问题的原因是什么?