编译和 ABI 有什么关系?
编译器的唯一工作是为操作系统和/或其他应用程序构建应用程序二进制接口 (ABI) 吗?
关于 ABI,引自维基百科:
ABI 涵盖数据类型、大小和对齐等细节;调用约定,它控制如何传递函数的参数和检索返回值;系统调用号以及应用程序应如何对操作系统进行系统调用;在完整的操作系统 ABI 的情况下,目标文件、程序库等的二进制格式。
感谢致敬!
我为 x86 编写了一些汇编代码,并希望仅使用 Mac 的默认汇编程序(“as”)将其汇编成纯二进制文件(不是 Mach-O)。经过几次谷歌搜索和尝试,我失败了。
虽然我知道如何使用 NASM 来做到这一点(使用选项:-f 二进制),但我不想这样做。因为我的代码是用 AT&T 语法编写的并且我已经习惯了。
我从来没有想过下面的问题,但由于我现在不得不在我的代码中处理一堆依赖项,我认为我最好直接了解我的事实.让我们将其限制为现代Linux版本,例如ubuntu amd64.
由于静态库不包含动态库引用,如何在静态库中解析未定义的符号?依赖二进制文件可以动态加载未定义的符号,还是编译时必须由另一个静态库或目标文件解析符号?
编译器是否可以通过链接动态库来解析(依赖于静态库的应用程序)的依赖关系,如果是这样,代码文本会通过静态解析为生成的二进制文件,还是存在动态引用?
例如,静态库L使用mallocfrom libc6.so,它将由应用程序使用A.将L和A两者动态地使用libc6.so中的malloc吗?
像GCC/VC这样的流行实现使用多态对象的第一个size_t空间作为指针,指向vtable结构.这是最新的C++ ABI的一部分吗?
如何实现RTTI,C++ ABI是否指定了如何实现?谢谢
我有一个 Android 库项目,它通过 Android NDK 在 C/C++ 中有一部分。我想为所有架构构建我的本机代码。如果我设置minSdkVersion为 21,则一切正常。但minSdkVersion如果我将minSdkVersionARM64-v8a 版本设置为 19,则我需要更低(SDK 19)。我知道没有运行 SDK 19 的 ARM64-v8a 设备。我如何才能实现在一个 APK 中构建所有平台并拥有minSdkVersion19 个?
我原以为 8 位 AVR 平台不需要任何对齐。但是,我在LLVM commit 中发现了以下评论:
以前的数据布局在处理原子时引起了问题。
例如,加载小于 16 位对齐的 16 位值是非法的。
这会更改数据布局,以便所有类型至少以它们自己的宽度对齐。
不幸的是,这个提交的原作者也不确定这是否正确:
自从我最初从 SourceForge 导入旧的 SVN 存储库以来,大部分对齐内容都没有受到影响。我没有处理过太多,所以我的知识很差。
最安全的假设是,如果某件事看起来是故意的,那可能不是;P
(8 位)AVR 上的对齐故事究竟是什么?
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参数。
我想学习D,但是我不太了解重要的事情。C ++和D之间的当前互操作性状态如何?
我确定不可能链接到C ++编译的二进制文件,因为它甚至不能与C ++编译器一起使用。但是,如果我有C ++库的源代码和一些D源代码,该怎么办?可以让他们说话吗?(希望以一种有效的方式)。
不同的C ++版本(C ++ 98、11、14、17和将来的版本)如何?
在C99标准告诉我们:
结构对象内可能有未命名的填充,但不是在其开头。
和
在结构或联合的末尾可能有未命名的填充。
我假设这也适用于任何 C++ 标准,但我没有检查它们。
让我们假设在 ARM Cortex-M 上运行的 C/C++ 应用程序(即在应用程序中使用两种语言)将一些持久数据存储在本地介质(例如串行 NOR 闪存芯片)上,并在上电后读取它循环,可能在将来升级应用程序本身之后。升级后的应用程序可能是用升级后的编译器(我们假设是 gcc)编译的。
让我们进一步假设开发人员很懒惰(当然不是我),并且直接将一些普通的 C 或 C++ 流式传输struct到闪存,而不是像任何偏执的有经验的开发人员那样首先将它们序列化。
事实上,有问题的开发人员很懒惰,但并非完全无知,因为他阅读了AAPCS(Arm 架构的过程调用标准)。
除了懒惰之外,他的理由如下:
structs 以避免在应用程序的其余部分出现未对齐问题。offsetof和 total sizeof)完全struct由 AAPCS为任何 C 或 C++ 确定。不过,开发者是有良心的,他有点担心:
我的问题是:那个懒惰的开发人员的生活有多危险?换句话说,struct在上述假设下,填充在 C/C++ 中的稳定性如何?
在提出这个问题两周后,收到的唯一答案并没有真正回答所提出的问题。我也在ARM 社区论坛上问过完全相同的问题,但根本没有答案。
然而,我选择接受3246135作为答案,因为:
我将没有正确答案视为与此案非常相关的信息。软件问题解决方案的正确性应该是显而易见的。在我的问题中所做的假设可能是正确的,但我无法轻易证明。此外,如果假设不正确,在一般情况下,后果可能是灾难性的。
相比风险,开发者在使用答案中暴露的策略时的负担似乎非常合理。假设一个恒定的字节序(这很容易强制执行),它是 100% …
有没有办法检查android的静态库?例如,对于 iOS 静态库,我们可以简单地调用:
lipo -info mylib.a
Run Code Online (Sandbox Code Playgroud)
它将显示mylib.a图书馆的架构。android静态库是否有类似的方法来查看库的ABI ?如果我lipo -info在 android 静态库上运行,我会收到错误。
有类似的命令吗?提前致谢。
abi ×10
c++ ×5
android ×2
android-ndk ×1
architecture ×1
arm ×1
assembly ×1
avr ×1
c ×1
d ×1
ffi ×1
gradle ×1
ios ×1
macos ×1
non-nullable ×1
padding ×1
pointers ×1
polymorphism ×1
rust ×1
vtable ×1