标签: abi

编译和 ABI 有什么关系?

编译和 ABI 有什么关系?

编译器的唯一工作是为操作系统和/或其他应用程序构建应用程序二进制接口 (ABI) 吗?

关于 ABI,引自维基百科

ABI 涵盖数据类型、大小和对齐等细节;调用约定,它控制如何传递函数的参数和检索返回值;系统调用号以及应用程序应如何对操作系统进行系统调用;在完整的操作系统 ABI 的情况下,目标文件、程序库等的二进制格式。

感谢致敬!

compiler-construction abi

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

是否可以在 Mac OS X 上仅使用 GNU 汇编器生成纯二进制文件?

我为 x86 编写了一些汇编代码,并希望仅使用 Mac 的默认汇编程序(“as”)将其汇编成纯二进制文件(不是 Mach-O)。经过几次谷歌搜索和尝试,我失败了。

虽然我知道如何使用 NASM 来做到这一点(使用选项:-f 二进制),但我不想这样做。因为我的代码是用 AT&T 语法编写的并且我已经习惯了。

macos assembly abi

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

关于C/C++静态库的推理

我从来没有想过下面的问题,但由于我现在不得不在我的代码中处理一堆依赖项,我认为我最好直接了解我的事实.让我们将其限制为现代Linux版本,例如ubuntu amd64.

由于静态库不包含动态库引用,如何在静态库中解析未定义的符号?依赖二进制文件可以动态加载未定义的符号,还是编译时必须由另一个静态库或目标文件解析符号?

编译器是否可以通过链接动态库来解析(依赖于静态库的应用程序)的依赖关系,如果是这样,代码文本会通过静态解析为生成的二进制文件,还是存在动态引用?

例如,静态库L使用mallocfrom libc6.so,它将由应用程序使用A.将LA两者动态地使用libc6.so中的malloc吗?

c++ build-process abi dynamic-linking static-libraries

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

C++ ABI是否指定了vTable和RTTI信息应该如何存在?

像GCC/VC这样的流行实现使用多态对象的第一个size_t空间作为指针,指向vtable结构.这是最新的C++ ABI的一部分吗?

如何实现RTTI,C++ ABI是否指定了如何实现?谢谢

c++ polymorphism pointers abi vtable

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

Android NDK:如何使用 minimumSdkVersion = 19 为 ARM64-v8a 构建

我有一个 Android 库项目,它通过 Android NDK 在 C/C++ 中有一部分。我想为所有架构构建我的本机代码。如果我设置minSdkVersion为 21,则一切正常。但minSdkVersion如果我将minSdkVersionARM64-v8a 版本设置为 19,则我需要更低(SDK 19)。我知道没有运行 SDK 19 的 ARM64-v8a 设备。我如何才能实现在一个 APK 中构建所有平台并拥有minSdkVersion19 个?

c++ android abi gradle android-ndk

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

8 位 AVR 需要什么对齐方式?

我原以为 8 位 AVR 平台不需要任何对齐。但是,我在LLVM commit 中发现了以下评论:

以前的数据布局在处理原子时引起了问题。

例如,加载小于 16 位对齐的 16 位值是非法的。

这会更改数据布局,以便所有类型至少以它们自己的宽度对齐。

不幸的是,这个提交的原作者也不确定这是否正确

自从我最初从 SourceForge 导入旧的 SVN 存储库以来,大部分对齐内容都没有受到影响。我没有处理过太多,所以我的知识很差。

最安全的假设是,如果某件事看起来是故意的,那可能不是;P

(8 位)AVR 上的对齐故事究竟是什么?

avr abi memory-alignment

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

在 FFI 中使用 ptr::NonNull 是否有效?

Rust 具有ptr::NonNull表示非NULL指针的类型。在 FFI 中使用这种类型是否安全?

是否保证具有相同的二进制表示(忽略非 FFI 上下文,例如Option优化)、对齐、寄存器使用*mut T

例如,我可以实现这个接口:

void call_me_from_c(char *without_nulls) __attribute__((nonnull));
Run Code Online (Sandbox Code Playgroud)

extern "C" fn call_me_from_c(without_nulls: ptr::NonNull<c_char>)
Run Code Online (Sandbox Code Playgroud)

我不希望这会任何事情(除了在误用NULL;时导致 UB 之外),但我希望接口记录该函数需要非NULL参数。

ffi abi non-nullable rust

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

D和C ++当前互操作性状态

我想学习D,但是我不太了解重要的事情。C ++和D之间的当前互操作性状态如何?

我确定不可能链接到C ++编译的二进制文件,因为它甚至不能与C ++编译器一起使用。但是,如果我有C ++库的源代码和一些D源代码,该怎么办?可以让他们说话吗?(希望以一种有效的方式)。

不同的C ++版本(C ++ 98、11、14、17和将来的版本)如何?

c++ programming-languages d language-interoperability abi

4
推荐指数
2
解决办法
379
查看次数

AAPCS (ARM ABI) 下的 C/C++ 结构填充有多稳定?

C99标准告诉我们:

结构对象内可能有未命名的填充,但不是在其开头。

在结构或联合的末尾可能有未命名的填充。

我假设这也适用于任何 C++ 标准,但我没有检查它们。

让我们假设在 ARM Cortex-M 上运行的 C/C++ 应用程序(即在应用程序中使用两种语言)将一些持久数据存储在本地介质(例如串行 NOR 闪存芯片)上,并在上电后读取它循环,可能在将来升级应用程序本身之后。升级后的应用程序可能是用升级后的编译器(我们假设是 gcc)编译的。

让我们进一步假设开发人员很懒惰(当然不是我),并且直接将一些普通的 C 或 C++ 流式传输struct到闪存,而不是像任何偏执的有经验的开发人员那样首先将它们序列化。

事实上,有问题的开发人员很懒惰,但并非完全无知,因为他阅读了AAPCS(Arm 架构的过程调用标准)

除了懒惰之外,他的理由如下:

  • 他不想打包structs 以避免在应用程序的其余部分出现未对齐问题。
  • AAPCS 为每种基本数据类型指定了固定对齐方式。
  • 填充的唯一合理动机是实现正确对齐。
  • 因此,他认为,填充(以及因此 memberoffsetof和 total sizeof)完全struct由 AAPCS为任何 C 或 C++ 确定。
  • 因此,他进一步解释说,我的应用程序无法解释同一应用程序的早期版本会写入的某些回读数据(当然,假设闪存中数据的偏移量没有在写作和阅读之间变化)。

不过,开发者是有良心的,他有点担心:

  • C 标准没有提到任何填充的原因。实现正确对齐可能是填充的唯一合理原因,但根据标准,编译器可以随意填充尽可能多的内容。
  • 他怎么能确定他的编译器真的遵循AAPCS呢?
  • 他的假设是否会突然被他将开始使用的一些明显无关的编译器标志或编译器升级打破?

我的问题是:那个懒惰的开发人员的生活有多危险?换句话说,struct在上述假设下,填充在 C/C++ 中的稳定性如何?

结论

在提出这个问题两周后,收到的唯一答案并没有真正回答所提出的问题。我也在ARM 社区论坛上问过完全相同的问题,但根本没有答案。

然而,我选择接受3246135作为答案,因为:

  1. 我将没有正确答案视为与此案非常相关的信息。软件问题解决方案的正确性应该是显而易见的。在我的问题中所做的假设可能是正确的,但我无法轻易证明。此外,如果假设不正确,在一般情况下,后果可能是灾难性的。

  2. 相比风险,开发者在使用答案中暴露的策略时的负担似乎非常合理。假设一个恒定的字节序(这很容易强制执行),它是 100% …

c c++ arm padding abi

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

如何查看android静态库的ABI?

有没有办法检查android的静态库?例如,对于 iOS 静态库,我们可以简单地调用:

lipo -info mylib.a 
Run Code Online (Sandbox Code Playgroud)

它将显示mylib.a图书馆的架构。android静态库是否有类似的方法来查看库的ABI ?如果我lipo -info在 android 静态库上运行,我会收到错误。

有类似的命令吗?提前致谢。

architecture android abi static-libraries ios

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