gpt4 book ai didi

c++ - 如何在编译时检测 ABI?

转载 作者:行者123 更新时间:2023-11-30 20:44:28 24 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




有没有办法在编译时检测 C/C++ 中的 ABI?我知道有用于操作系统和 CPU 架构的宏。 ABI 是否有类似的宏(或其他方式)?

最佳答案

ABI 的概念对于 C11 或 C++14 等标准规范来说是未知的。这是一个实现的东西。

你可以在 Linux 上使用 feature_test_macros(7) .

您可以考虑改进您的构建过程(例如您的 Makefile 等...)。您可能会运行一些 shell 脚本检测功能(如 autoconf 生成的 configure 脚本)。请注意,一些 C 或 C++ 代码(例如头文件等)可能会在构建时生成(例如:由 bisonmocrpcgenswig 、...)通过您自己的实用程序或脚本。使用足够好的build automation工具(小心,GNU makeninja 能够处理生成的 C++ 或 C 代码并管理它们的生成和依赖关系)。

不要将编译与 build 混淆;运行 compiler 的编译命令只是构建过程的一部分。

一些平台接受多个 ABI。例如。我的带有 Linux 4.13 内核的 Linux/Debian/Sid/x86-64 桌面可以运行 x86 32 位 ELF可执行,x86-64 64 位 ELF,可能是一些旧的 a.out 1980 年代的格式,还有 x32 ABI。与 binfmt_misc我可以添加更多的 ABI。见 x86 psABI获取几个 ABI 文档的列表。

BTW,目前的趋势是尝试写portable代码。也许使用像 Qt 这样的框架或 POCOGlib (和许多其他人)可以将 ABI 详细信息隐藏到您的应用程序中。

在某些情况下,libffi也可能有帮助。

一般来说,一旦您了解了您的操作系统和架构,您几乎可以 - 大多数时间 - 推断出 ABI。

如果你真的想要您的 ABI,那么一种可能的 Linux 特定方式可能是运行 file(1)在当前的可执行文件上。 我不建议这样做,但您可以尝试 (使用 proc(5) 获取可执行文件):

 /// return a heap allocated string describing the ABI of current executable
//// I don't recommend using this
const char*getmyabi(void) {
char mycmdname[80];
int sz = snprintf(mycmdname, sizeof(mycmdname),
"/usr/bin/file -L /proc/%d/exe",
getpid());
assert (sz < (int) sizeof(mycmdname));
FILE*f = popen(mycmdname, "r");
if (!f) {
perror(mycmdname); exit(EXIT_FAILURE);
};
char* restr = NULL;
size_t siz = 0;
getline(&restr, &siz, f);
if (pclose(f)) { perror("pclose"); exit(EXIT_FAILURE); };
return restr;
} // end of getmyabi
/// the code above in untested

你可以得到一个像这样的字符串:
 "ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked,"
" interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32,"
"BuildID[sha1]=deca50aa4d3df4d57bacc464aa1e8790449ebf8e, stripped"

那么你需要解析它。您可能还想解析 ldd(1) 的输出。或 objdump(1)在您的可执行文件上,您的 ELF 解释器 ld-linux(8)等....(或为此使用一些 ELF 解析库)。

不知道有多大用处 getmyabi功能。我不知道精确的输出是什么 file给予(在各种 ABI 的所有奇怪情况下)。我让你来测试它(一定要在你的系统上安装所有 ABI 来编译你的测试程序,所以 gcc -m32gcc -m64gcc -mx32 等等......);如果可能的话,在一些非 x86 Linux 系统上进行测试。

如果您只需要在构建时获取 ABI,请考虑编译一些 hello-world 可执行文件,然后运行 ​​ file (和 ldd )就可以了。有适当的构建规则( Makefile 规则)这样做并解析这些 file 的输出和 ldd命令。

(我对你的问题感到惊讶;什么样的应用程序需要知道 ABI;大多数需要编译器的软件......;对精确 ABI 的强烈依赖可能是 undefined behavior 的症状。)

也许给出的提示 here可能适用于您的情况(只是盲目猜测)。

如果您正在编写一些编译器,请考虑 generating some C code然后在生成的 C 代码上使用一些现有的 C 编译器,或者使用好的 JIT compilation图书馆喜欢 LIBGCCJITLLVM .他们会处理 ABI 的特定方面(更重要的是低级优化和代码生成)。

如果您正在单独编写编译器并且不想使用外部工具,那么您实际上应该将自己限制在一个或几个 ABI 和平台上。 生命短暂。

PS。我完全不确定 ABI 是否有确切的含义。它更像是一个规范文档,而不是某个系统(或某些可执行文件)的定义特征。 IIUC,ABI 规范确实发展了(可能在 15 年前并不完全相同)。

关于c++ - 如何在编译时检测 ABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47119992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com