Questions tagged «abi»

(应用程序二进制接口)指定程序,库和操作系统之间的低级接口。例如,哪些寄存器用于传递功能参数。

5
C ++标准是否允许未初始化的bool使程序崩溃?
我知道C ++ 中的“未定义行为”几乎可以允许编译器执行其想要的任何操作。但是,由于我认为代码足够安全,因此发生了一次崩溃,这让我感到惊讶。 在这种情况下,真正的问题仅在使用特定编译器的特定平台上发生,并且仅在启用优化后才发生。 为了重现此问题并将其简化到最大程度,我尝试了几件事。下面是一个函数的提取物被称为Serialize,这将需要一个布尔参数,并复制字符串true或false到现有的目标缓冲区。 此功能是否在代码审查中,如果bool参数是未初始化的值,实际上没有办法告诉它崩溃吗? // Zero-filled global buffer of 16 characters char destBuffer[16]; void Serialize(bool boolValue) { // Determine which string to print based on boolValue const char* whichString = boolValue ? "true" : "false"; // Compute the length of the string we selected const size_t len = …

16
什么是应用程序二进制接口(ABI)?
我从不清楚什么是ABI。请不要将我指向Wikipedia文章。如果我能理解的话,我就不会在这里发表如此冗长的文章。 这是我对不同接口的看法: 电视遥控器是用户和电视之间的接口。它是一个现有的实体,但是它本身是无用的(不提供任何功能)。电视机上实现了遥控器上每个按钮的所有功能。 接口:是该功能的functionality和之间的“现有实体”层 consumer。接口本身不执行任何操作。它只是调用后面的功能。 现在,取决于用户是谁,有不同类型的界面。 命令行界面(CLI)命令是现有的实体,使用者是用户,而功能却在后面。 functionality: 我的软件功能可以解决我们描述此界面的某些目的。 existing entities: 命令 consumer: 用户 图形用户界面(GUI)窗口,按钮等是现有的实体,而使用者又是用户,功能又在后面。 functionality: 我的软件功能解决了我们描述此接口时遇到的一些问题。 existing entities: 窗口,按钮等。 consumer: 用户 应用程序编程接口(API)函数(或更准确地说)(在基于接口的编程中)接口是现有的实体,此处的使用者是另一个程序,而不是用户,并且功能仍在该层后面。 functionality: 我的软件功能解决了我们描述此接口时遇到的一些问题。 existing entities: 函数,接口(函数数组)。 consumer: 另一个程序/应用程序。 应用程序二进制接口(ABI)这就是我的问题所在。 functionality: ??? existing entities: ??? consumer: ??? 我已经用不同的语言编写了软件,并提供了不同种类的界面(CLI,GUI和API),但是我不确定是否提供过任何ABI。 维基百科说: ABI涵盖了诸如 数据类型,大小和对齐方式; 调用约定,它控制如何传递函数的参数以及如何检索返回的值; 系统调用号以及应用程序应如何对操作系统进行系统调用; 其他ABI标准化细节,例如 C ++名称修改 异常传播,以及 相同平台上的编译器之间的调用约定,但不需要跨平台兼容性。 谁需要这些细节?请不要说操作系统。我知道汇编编程。我知道链接和加载的工作方式。我确切地知道里面发生了什么。 …

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

10
在C中通过值传递结构而不是传递指针是否有不利之处?
在C中通过值传递结构而不是传递指针是否有不利之处? 如果结构很大,显然有复制大量数据的性能方面,但是对于较小的结构,它基本上应该与将多个值传递给函数相同。 当用作返回值时,它甚至可能更有趣。C仅具有从函数返回的单个值,但是您经常需要多个。因此,一个简单的解决方案是将它们放在结构中并返回该结构。 是否有任何理由支持或反对? 由于可能不是所有人都知道我在这里说的是什么,所以我举一个简单的例子。 如果您使用C语言进行编程,则迟早会开始编写如下所示的函数: void examine_data(const char *ptr, size_t len) { ... } char *p = ...; size_t l = ...; examine_data(p, l); 这不是问题。唯一的问题是,您必须与您的同事达成共识,在该同事中,参数应为顺序,以便在所有功能中使用相同的约定。 但是,当您想返回相同类型的信息时会发生什么呢?您通常会得到以下内容: char *get_data(size_t *len); { ... *len = ...datalen...; return ...data...; } size_t len; char *p = get_data(&len); 这可以正常工作,但存在更多问题。返回值是一个返回值,除了在此实现中不是。从上面无法得知,不允许函数get_data查看len指向什么。没有什么可以使编译器检查通过该指针实际返回的值。因此,下个月,当其他人修改了代码却没有正确理解它(因为他没有阅读文档?)时,它就崩溃了,而没有任何人注意,或者它开始随机崩溃。 所以,我提出的解决方案是简单的结构 struct blob { char …





3
链接C ++ 17,C ++ 14和C ++ 11对象是否安全
假设我有三个编译对象,它们都是由同一编译器/版本生成的: A是使用C ++ 11标准编译的 B用C ++ 14标准编译 C用C ++ 17标准编译 为简单起见,我们假设所有标头均使用 C ++ 11编写,仅使用其语义在所有三个标准版本之间均未改变的构造,因此任何相互依赖关系都可以通过标头包含正确表达,并且编译器不反对。 这些对象是哪种组合,链接到单个二进制文件不安全吗?为什么? 编辑:涵盖主要编译器(例如gcc,clang,vs ++)的答案是受欢迎的
97 c++  c++11  linker  c++14  abi 

4
为什么T *可以在寄存器中传递,但unique_ptr <T>无法传递?
我正在观看Chandler Carruth在CppCon 2019中的演讲: 没有零成本抽象 在该示例中,他举例说明了您对使用std::unique_ptr&lt;int&gt;over和会产生多少开销而感到惊讶int*。该段大约在时间点17:25开始。 您可以看一下他的示例代码对(godbolt.org)的编译结果 -可以看到,确实,编译器似乎不愿意传递unique_ptr值-实际上,底线是只是一个地址-在寄存器内,仅在直接内存中。 Carruth先生在27:00左右提出的观点之一是,C ++ ABI要求按值传递参数(某些但不是全部;也许-非基本类型?而不是在寄存器中。 我的问题: 这实际上是某些平台上的ABI要求吗?(哪个?)或者在某些情况下可能只是一些悲观? 为什么ABI这样?也就是说,如果结构/类的字段适合寄存器,甚至单个寄存器,为什么我们不能在该寄存器中传递它呢? 近年来,C ++标准委员会是否曾经讨论过这一点? PS-为了不给这个问题留下代码: 普通指针: void bar(int* ptr) noexcept; void baz(int* ptr) noexcept; void foo(int* ptr) noexcept { if (*ptr &gt; 42) { bar(ptr); *ptr = 42; } baz(ptr); } 唯一指针: using std::unique_ptr; void bar(int* ptr) noexcept; void …

3
ELF文件格式的节和段有什么区别
来自Wiki可执行和可链接格式: 这些段包含文件运行时执行所需的信息,而各段包含用于链接和重定位的重要数据。整个文件中的任何字节最多只能由一个部分拥有,并且可以有任何部分都不拥有的孤立字节。 但是节和段之间有什么区别?在可执行的ELF文件中,段中是否包含一个或多个节?
72 linux  debian  gnu  elf  abi 

1
GCC的-Wpsabi选项到底能做什么?抑制它意味着什么?
背景 去年,我使用了nlohmann json库[1],并且使用GCC 5.x在x86_64上进行了交叉编译arm-linux-gnueabi-*而没有任何警告。当我将GCC更新为较新版本时,GCC会生成含糊的诊断说明页面。例如,这是注释之一 In file included from /usr/arm-linux-gnueabi/include/c++/7/vector:69:0, from include/json.hpp:58, from src/write_hsi.cpp:23: /usr/arm-linux-gnueabi/include/c++/7/bits/vector.tcc: In member function ‘void std::vector&lt;_Tp, _Alloc&gt;::_M_realloc_insert(std::vector&lt;_Tp, _Alloc&gt;::iterator, _Args&amp;&amp; ...) [with _Args = {nlohmann::basic_json&lt;std::map, std::vector, std::__cxx11::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, bool, long long int, long long unsigned int, double, std::allocator, nlohmann::adl_serializer&gt;}; _Tp = nlohmann::basic_json&lt;&gt;; _Alloc = std::allocator&lt;nlohmann::basic_json&lt;&gt; &gt;]’: …
69 c++  linux  gcc  gcc-warning  abi 

1
为什么在不使用堆栈内存时分配堆栈内存?
考虑以下示例: struct vector { int size() const; bool empty() const; }; bool vector::empty() const { return size() == 0; } 生成的汇编代码vector::empty(通过clang,带有优化): push rax call vector::size() const test eax, eax sete al pop rcx ret 为什么要分配堆栈空间?完全不使用。该push和pop可以省略。优化的MSVC和gcc构建也为此功能使用了堆栈空间(请参阅godbolt),因此必须有一个原因。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.