Tag: abi

在linux下libcxxabi有意义吗? 有什么好处?

我试图确定是否build立和使用linux下的llvm项目的libcxxabi是有道理的。 我的libcxxabi链接到 ldd libc++abi.so.1.0 linux-vdso.so.1 => (0x00007fff2e0db000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd658f0d000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fd658d05000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd65893c000) libc++.so.1 => /path/where/clang/is // edited /lib64/ld-linux-x86-64.so.2 (0x00007fd6593ab000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd658465000) 所以它使用gcc_s库,GNU librt,唯一真正的区别是它使用libc++不是libstdc++ ,但是这真的有多好? 鉴于abi图书馆的关键作用,我应该在这样的平台下去找libcxxabi ? 我的问题不是如何build立这个,或者如果这能够工作,但如果这是一个好主意C ++明智 ,我可能得到什么样的好处,或者如果你已经使用这个好处,你会得到什么样的好处。

ELF文件格式中的段和段有什么区别

从wiki 可执行文件和可链接的格式 : 段包含文件的运行时执行所必需的信息,而段包含用于链接和重定位的重要数据。 整个文件中的任何字节最多只能由一个部分所有,并且可以有不属于任何部分的孤立字节。 但是细分市场和细分市场有什么区别? 在可执行的ELF文件中,段是否包含一个或多个段?

API和ABI之间的区别

我是Linux系统编程的新手,在阅读Linux系统编程时遇到了API和ABI。 API的定义: 一个API定义了一个软件在源代码层与另一个软件进行通信的接口。 ABI的定义: API定义了源接口,而ABI则定义了特定体系结构上两个或更多软件之间的低级二进制接口。 它定义了应用程序如何与自身交互,应用程序如何与内核交互以及应用程序如何与库进行交互。 程序如何在源代码级进行通信? 什么是来源水平? 它与源代码有关吗? 或者图书馆的来源包含在主程序中? 我所知道的唯一区别是API主要由程序员使用,ABI主要由编译器使用。

在C中通过结构传递结构有什么缺点,而不是传递一个指针?

在C中通过结构传递结构有什么缺点,而不是传递一个指针? 如果结构很大,显然有复制大量数据的性能方面,但是对于一个较小的结构,它应该基本上是将多个值传递给一个函数。 用作返回值可能更有趣。 C只有函数的单个返回值,但是你经常需要几个。 所以一个简单的解决scheme是把它们放在一个结构中并返回。 这有什么理由吗? 由于这里可能不太清楚我在说什么,我将举一个简单的例子。 如果你用C编程,你迟早会开始编写如下的函数: void examine_data(const char *ptr, size_t len) { … } char *p = …; size_t l = …; examine_data(p, l); 这不是问题。 唯一的问题是,你必须同意你的同事参数的顺序,所以你在所有的function使用相同的约定。 但是当你想要返回相同types的信息时会发生什么? 你通常得到这样的东西: char *get_data(size_t *len); { … *len = …datalen…; return …data…; } size_t len; char *p = get_data(&len); 这工作正常,但更多的问题。 返回值是一个返回值,除了在这个实现中它不是。 上面没有办法告诉我们函数get_data不允许查看len指向的内容。 没有什么能够使编译器检查一个值是否通过该指针实际返回。 那么下个月,当别人修改代码而不正确地理解代码(因为他没有阅读文档?)它会被打破,没有任何人注意到,或者随机开始崩溃。 所以,我提出的解决scheme是简单的结构 struct […]

什么是x86_64 va_list结构的格式?

任何人都可以参考x86_64 ABI(在Linux上使用的)中的va_list的表示? 我试图debugging一些代码堆栈或参数看起来腐败,这将有助于理解我应该看到什么…

将一个32位偏移量添加到x86-64 ABI的指针时,是否需要符号或零扩展?

简介:我正在查看汇编代码来指导我的优化,并将int32添加到指针时看到大量符号或零扩展。 void Test(int *out, int offset) { out[offset] = 1; } ————————————- movslq %esi, %rsi movl $1, (%rdi,%rsi,4) ret 起初,我认为我的编译器在添加32位到64位整数时遇到了挑战,但是我已经用Intel ICC 11,ICC 14和GCC 5.3证实了这种行为。 这个线程证实了我的发现,但是不清楚符号或零扩展是否必要。 只有在高32位还没有设置的情况下,这个符号/零扩展才是必要的。 但是,x86-64 ABI不会足够聪明,需要吗? 我有点不情愿改变我所有的指针偏移ssize_t,因为注册溢出会增加代码的caching足迹。

什么是应用程序二进制接口(ABI)?

我从来不清楚ABI是什么。 请不要指向我的维基百科文章。 如果我能理解的话,我不会在这里发表如此冗长的post。 这是我对不同接口的看法: 电视遥控器是用户和电视机之间的接口。 它是一个现有的实体,但它本身没有用(不提供任何function)。 遥控器上每个button的所有function都在电视机中实现。 接口:它是该functionality和consumer之间的“现有实体”层。 一个接口本身是不会做任何事情的。 它只是调用后面的function。 现在取决于谁是用户是有不同types的接口。 命令行界面(CLI)命令是现有的实体,消费者是用户,function在后面。 functionality:我的软件function,它解决了我们正在描述这个接口的一些目的。 existing entities:命令 consumer:用户 graphics用户界面(GUI)窗口,button等是现有的实体,消费者也是用户,function在后面。 functionality:我的软件function,它解决了我们正在描述这个接口的一些目的。 existing entities:窗口,button等。 consumer:用户 应用程序编程接口(API)函数或更正确的接口(在基于接口的编程中)是现有的实体,这里的消费者是另一个程序而不是用户,并且function也在这个层之后。 functionality:我的软件function,它解决了我们正在描述这个接口的一些目的。 existing entities:函数,接口(函数的数组)。 consumer:另一个程序/应用程序 应用程序二进制接口(ABI)这是我的问题开始的地方。 functionality: ??? existing entities: ??? consumer: ??? 我用不同的语言编写了软件,提供了不同的界面(CLI,GUI和API),但是我不确定是否曾经提供过任何ABI。 维基百科说: ABI涵盖了诸如 数据types,大小和alignment; 调用约定,它控制如何传递函数的参数和返回值检索; 系统调用号码以及应用程序如何对操作系统进行系统调用; 其他ABI标准化的细节,如 C ++的名字改变, exception传播和 在同一平台上调用编译器之间的约定,但不要求跨平台兼容性。 谁需要这些细节? 请不要说操作系统。 我知道程序集编程。 我知道如何链接和加载工作。 我知道里面到底发生了什么。 为什么C ++的名字来了? 我以为我们在二元层面上谈论。 为什么语言进来? 无论如何,我已经下载了[PDF] […]

如何安全地将对象,尤其是STL对象传递给DLL?

如何将类对象,特别是STL对象传递给C ++ DLL? 我的应用程序必须以DLL的forms与第三方插件进行交互,而且我无法控制这些插件所用的编译器。 我知道STL对象没有保证ABI,我担心导致我的应用程序不稳定。

在i386和x86-64上,UNIX和Linux系统调用的调用约定是什么?

以下链接解释了UNIX(BSD flavor)和Linux的x86-32系统调用约定: http://www.int80h.org/bsdasm/#system-calls http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html 但是,UNIX和Linux上的x86-64系统调用约定是什么?