标签: abi

就 ABI 兼容性而言,静态库的行为是否与动态库类似?

我了解到,您不能一起使用由不同编译器编译的共享库,因为它们的 ABI 通常不兼容。当然例外的是如果你有一个纯C 接口,那么这是可能的。但是,我在这方面没有找到关于静态库的明确说明,因此提出这个问题。

我的问题是静态库是否有同样的问题。如果我的共享库链接到来自不同编译器的静态库,它会在运行时按预期进行编译和工作吗?或者它会编译并表现得很糟糕吗?或者它永远不会编译?

c++ abi static-libraries

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

为什么 x86-64 Linux ABI 通过寄存器中小于 16 字节的值而不是 8 来传递结构?

在 C 级别,建议通常通过指针传递大于字大小(x86-64 上为 8 字节)的任何内容,并通过值传递任何小于字大小的内容(意味着通过寄存器)。争论的焦点应该是传递 1 个指针值比传递 N 个成员更有效。但这似乎即使对于 N=2 也应该是正确的。那么为什么 ABI 只有在超过 16 个字节时才开始使用内存呢?为什么不是8?

按值传递 16 字节结构与 24 字节传递的代码生成差异示例: https: //godbolt.org/z/5WdjEEr4E

c linux assembly x86-64 abi

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

当 C++ 没有稳定的 ABI 时,为什么可以链接到 C++ 动态库?

以 Boost 为例,boost::filesystem当 C++ 没有稳定的 ABI 时,为什么我能够从我的 C++ 程序进行链接。

我的系统中安装了 Boost,并且玩具程序能够使用 进行链接-lboost_filesystem,即使boost::filesystem公开了 C++ API(没有 extern 'C' )。

那么,是否可以创建可以被各种编译器版本链接的C++共享库呢?Boost 如何在没有“extern C”的情况下实现这一目标?

我试过:

#include <iostream>
#include <boost/filesystem.hpp>

namespace fs = boost::filesystem;

int main() {
    // Replace "/path/to/directory" with the path to the directory you want to list
    std::string directory_path = "/path/to/directory";

    try {
        // Check if the given path exists and is a directory
        if (fs::exists(directory_path) && fs::is_directory(directory_path)) {
            std::cout << "Listing files in directory: " …
Run Code Online (Sandbox Code Playgroud)

c++ boost ffi abi

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

如何在汇编语言中使用c库函数fgets?

如标题所述,如何在汇编语言中使用c库函数fgets?实际上,我想知道如何获取stdin的文件指针.感谢您的回复.

c assembly abi

3
推荐指数
1
解决办法
1421
查看次数

Linux内核模块ABI(x86)

我正在寻找在x86上用于内核模块调用的ABI的官方定义.我最近查看了一个已编译的模块,并惊讶地发现:

  • 它使用寄存器传递前三个参数(eax,edxecx).

  • 它不像fastcallGCC文档中描述的那样.该文件说的是 fastcall使用ECX和EDX(微软风格).

我能找到的唯一有点相关的信息就是这个,但它并没有说太多.

所以:

1)是否有关于内核模块中使用的ABI的官方文档(不是系统调用ABI而不仅仅是函数列表 - 我找到的那些).

2)编译器如何产生这种奇怪的快速调用?我错过了一个开关吗?

linux x86 kernel abi

3
推荐指数
1
解决办法
768
查看次数

用于Visual Studio C++ ABI和VS编译对象的readelf实用程序?

我在寻找替代的readelfobjdump二重奏使用Visual Studio编译C++源代码和调查时lib,objdll.

我知道MinGW提供了这个工具的移植,但我正在寻找官方支持Microsoft C++ ABI的东西.

如果这件事,我正在使用Visual Studio 2012.

谢谢.

c++ abi objdump visual-c++ readelf

3
推荐指数
1
解决办法
694
查看次数

是否可以在Android VM中检测运行时的ABI?

我需要能够在Java中检测运行时设备的ABI(armeabi,armeabi-v7a,x86或mips).这可能吗 ?

android abi android-ndk

3
推荐指数
2
解决办法
1598
查看次数

abi :: __ cxa_demangle-为什么需要对缓冲区进行malloc编辑?

的文档abi::__cxa_demangle(例如https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html)指定第二个参数char * output_buffer需加malloc-ed。

这意味着不允许在堆栈上分配如下所示的字符缓冲区。

  enum {N = 256};
  char output_buffer[N];
  size_t output_length = 0;
  int status = -4;
  char * const result = std::__cxa_demangle(mangled_name,
                        output_buffer, &output_length, &status);
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 为什么output_buffer不允许在堆栈上?

  2. 为什么已经传递输出缓冲区时返回不同的指针?

backtrace()示例的影响,我会想到一个像以下的API

// Demangle the symbol in 'mangled_name' and store the output
// in 'output_buffer' where 'output_buffer' is a caller supplied
// buffer of length 'output_buffer_length'. The API returns the 
// number of bytes written to 'output_buffer' which is …
Run Code Online (Sandbox Code Playgroud)

c++ api abi demangler

3
推荐指数
1
解决办法
818
查看次数

为什么x86-64使用IA-64 C++ ABI?

x86-64 psABI:

9.1 C++

对于C++ ABI,我们将使用IA-64 C++ ABI并适当地实例化它.该ABI的当前草案可在以下网站获得:

http://mentorembedded.github.io/cxx-abi/

为什么不设计自己的ABI?

c++ x86-64 abi calling-convention design-decisions

3
推荐指数
1
解决办法
154
查看次数

为什么C中的填充对于在堆栈上分配的变量/结构有效?

我在这里阅读有关C语言中的结构填充的信息:http : //www.catb.org/esr/structure-packing/
我不明白为什么在编译时为堆栈分配的变量/结构确定的填充在所有情况下在语义都是有效的。让我提供一个例子。假设我们要编译以下玩具代码:

int main() {
    int a;
    a = 1;
}
Run Code Online (Sandbox Code Playgroud)

在X86-64上gcc -S -O0 a.c生成此程序集(删除了不必要的符号):

main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $1, -4(%rbp)
    movl    $0, %eax
    popq    %rbp
    ret
Run Code Online (Sandbox Code Playgroud)

在这种情况下,为什么我们知道4的值%rbp并因此%rbp-4是4对齐的,以适合于int的存储/加载?

让我们尝试使用结构相同的示例。

main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $1, -4(%rbp)
    movl    $0, %eax
    popq    %rbp
    ret
Run Code Online (Sandbox Code Playgroud)

从阅读中我推断出结构的填充版本看起来像这样:

struct st{
    char a;
    int b;
}
Run Code Online (Sandbox Code Playgroud)

所以,第二个玩具的例子

struct st{
    char a;      // 1 byte
    char …
Run Code Online (Sandbox Code Playgroud)

c linux assembly x86-64 abi

3
推荐指数
1
解决办法
170
查看次数