问题标签 [abi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
306 浏览

c++ - Qt 容器如何作为参数传递给共享库的函数?

我正在编写一个库函数,我真的需要能够将vectors&之类的参数传递maps给它。

我知道你不能在库的头文件中声明一个带有 STL 参数的函数

由于二进制兼容性问题,除非库和可执行文件是使用相同的编译器和设置编译的。

另一方面,使用Qt 模板库进行以下工作

即使他们提供的 DLL 可能是由与我不同的编译器编译的。

Qt使用什么技术来QMap克服这个兼容性问题? QValueListQString

我已经阅读了他们的代码,但我无法隔离该技术。

问题 1:有人可以向我解释(可能通过简短的演练吗?)如何编写应用他们技术的代码?

我知道的唯一可行的技术是提供string/map作为不透明的指针,或使用pImpl成语。

问题 2:我可以使用 STLPort 代替“本机”STL 标头来实现这种调用吗?这对 STL 的性能有何影响?

0 投票
1 回答
519 浏览

iphone - 在任何操作系统上运行不同格式的可执行文件

如果我做对了,这应该不会像人们想象的那么难。具体来说,我将从 iOS 和 ELF 可执行格式开始。让我们澄清一下,我有一部越狱的 iPhone,我不想在任何 appstore 应用程序中这样做,所以请避免像“你不能这样做,因为它被 Apple 禁止”这样的“好建议”。

所以,我所看到的是有一个名为 Frash 的 Flash 播放器实现(由 Comex 顺便说一句,最近越狱的开发者)。安装后,此实用程序要求 Android 的 libflashplayer.so 存在(复制到)iPhone 文件系统。我深入研究了源代码,发现该调整实际上打开了 Android (ELF) 共享对象文件,“解析”它并从中执行代码。我已经问过我的一个朋友这实际上是否可行,他告诉我是的,因为 ARM 上的 ELF 和 ARM 上的 Mach-O 是二进制兼容的(因为它们都是 ARM)。但是他居然没有给我详细的解释,所以我想问一下怎么做?我不能完全理解处理的源代码片段,但有一件事是肯定的:

(来自原始代码,截至 2011 年 2 月 12 日在 GitHub 上)

在我看来,他使用 libelf 来执行此操作,对吗?并且在 ELF 文件中有可以在兼容处理器上执行的符号吗?

我还想知道所有其他处理器架构是否都适用?那么也许可以在 OS X 上执行 Linux 二进制文件中的符号?

0 投票
3 回答
2595 浏览

c++ - STL 容器和二进制接口兼容性

STL 二进制接口

我很想知道是否有人正在为跨多个 C++ 编译器和平台的 STL 对象开发兼容的接口层。

目标是支持 STL 类型作为第一类或内在数据类型。

一般来说,模板是否存在一些固有的设计限制来防止这种情况发生?这似乎是使用 STL 进行二进制分发的主要限制。

理论——也许答案是务实的

  1. 微软已经在 .NET 上投入了精力,并不真正关心 C++ STL 支持是“一流的”。

  2. 开源并不想推广仅二进制分发,而是专注于使用单个编译器而不是 10 个不同版本的不匹配来解决问题。

这似乎得到了我对 Qt 和其他库的经验的支持——它们通常为您将要使用的环境提供构建。例如 Qt 4.6 和 VS2008。

参考:

0 投票
1 回答
481 浏览

c++ - Linux (elf) 上的共享库和链接

我已阅读有关使用 Boost 创建具有向后兼容 ABI 的库的主题,现在我正在尝试了解如何链接我的共享库以保持稳定的 ABI,并避免出现干扰符号的问题。

我创建了以下简单的测试项目:

库 common_v1 和 common_v2 应该模拟库 a 和 b 的外部依赖(如 Boost)。因为 common_v1 和 common_v2 被视为外部库,所以我不希望更改它们的构建系统(并且不更改它们编译时使用的标志)。

上面的项目,编译正常,但它不起作用!执行测试应用程序时,它会跳转到断言语句。

这让我相信在 liba 和 libb 中使用了相同的 common 定义。为什么会这样,我做错了什么?

0 投票
1 回答
1153 浏览

objective-c - Objective-C 2.0 ABI 规范

Objective-C 2.0 ABI 的文档是否存在于 Internet 上的某个地方?发布说明objc4-493.9说:

即将发布的文档将描述仅用于编译器和开发工具的 ABI。

从那以后它被释放了吗?最接近的此类参考是 Apple 的Objective-C 运行时参考,但这仅描述了面向公众的 API,而不是实现细节。事实上,它甚至顺便提到了 ABI:

此外,新的 Objective-C ABI(此处未描述)[...]

不幸的是,新的 ABI 在上述文本中没有超链接。:-) 我唯一的选择是了解objc4运行时和 Clang 的CGObjCNonFragileABIMac代码生成项目的源代码吗?

0 投票
3 回答
1135 浏览

linux - 你在哪里检查 x86-64 机器上的系统调用原型?

也就是说,你怎么知道

特定系统调用需要多少参数,

每个参数应该在哪个寄存器中,

最后每个参数的含义是什么?

有没有man类似的命令可以告诉你?

0 投票
1 回答
2169 浏览

java - Java Native Interface (JNI) 是否受 C++ ABI 兼容性问题的影响?

Java Native Interface (JNI) 是否受 C++ ABI 兼容性问题的影响?

我正在开发一个 Java 应用程序。我想使用 Java 本机接口 (JNI) 来调用 C++ 库中的函数。我可以访问 C++ 库的代码,并且可以根据需要重新构建它。(例如,我可以静态链接 C++ 运行时。)

我可以要求我的用户拥有 JRE 6 或更高版本,但我不能要求他们拥有任何特定的 C++ 运行时。

一位同事向我指出了这篇博客文章:http ://www.trilithium.com/johan/2005/06/static-libstdc/ ,它建议不要使用动态加载的 C++ 代码。

另一位同事向我指出了这个错误报告:http ://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4694590 ,其中详细说明了这些问题在 Java 1.4.2 中是如何解决的。

据我了解,问题的要点是 libstdc++ 的二进制接口经常发生变化。如果 C++ 应用程序加载使用不同编译器构建的 C++ 共享库,则两个不兼容的 libstdc++ 库将同时加载到内存中。

错误报告解释了 Java 1.4.2 的解决方案:“我们在 JDK 中静态链接 C++ 运行时并启用链接器脚本以隐藏 libstdc++ 和其他内部符号的符号。结果,这些符号对 JNI 代码变得不可见,并且当某些本机代码需要调用 C++ 运行时,调用将通过适当的 libstdc++.so 解析。仍然有两个 libstdc++.so 同时加载,但应该是良性的。”

我对此有几个问题。

首先,OpenJDK 是否继续采用这种方法?

[编辑:我在 OpenJDK 的 build-dev 邮件列表中提出了这个问题。答案是肯定的,HotSpot 仍然静态链接 libstdc++,但显然“大多数 Linux 发行版都对此进行了修补”。另一位开发人员指出,这甚至不需要补丁:“设置 STATIC_CXX=false 就足够了(默认为 true)。”]

其次,即使在这种情况下,同时加载两个不兼容的 libstdc++.so 真的是良性的吗?

第三,这种方法(隐藏 JDK 中的符号)是否解决了所有的兼容性问题?

上面引用的博客文章警告说“针对不同 ABI 编译的代码根本不兼容二进制”。后来,“语言运行时支持通常依赖于一些共享的数据,例如访问某种锁或全局数据结构(类似于 C 程序需要共享 errno)。”

这听起来像是问题无法解决。

再说一次,也许 ABI 不兼容不再是问题了。博客文章已有六年多的历史了。另一个 stackoverflow 问题(GCC ABI 兼容性)的一个答案断言“自 gcc-3.4.0 以来,ABI 是向前兼容的。” 那成功了吗?

我将不胜感激有关这些问题的任何指导。(嘿,感谢您阅读所有这些内容!)

编辑

我的问题变得很长,所以我没有提供所有细节。为了解决威尔的评论:

  1. 我只需要调用 extern "C" 函数。(例如,我使用 javah 生成 C 头文件。)
  2. 我不需要与 JVM 中的 C++ 运行时交互。(我基本上只需要将字符串发送到 C++ 库。)
0 投票
1 回答
263 浏览

java - Eclipse 是否必须处理 C++ ABI 兼容性问题?

Eclipse 项目为 Linux 提供了安装程序。这些安装程序(或已安装的可执行文件)是否包含任何已编译的 C++ 代码?如果是这样,Eclipse 如何避免 C++ ABI 兼容性问题?

我认为 Eclipse 的本地库(如SWT)都必须用 C 编写。(我们现在先忽略 Windows。)查看 SWT 的源代码时,我注意到与XPCOM 相关的代码是用 C++ 编写的。

那么诀窍是什么?如果我从安装程序安装 Eclipse,我会得到这些东西吗?如果是这样,无论我的机器上使用哪个 C++ 运行时,它都能正常工作吗?如果是这样,“他们”是如何做到的?

(先发制人地解决花生画廊:我意识到我可以使用包管理器来安装 Eclipse。我问的是程序不是专门为我的机器量身定制的情况。)

我注意到SWT FAQ 解释说,“SWT 使用 JNI 与操作系统中的本机小部件进行交互。必须针对感兴趣的窗口系统、操作系统和硬件架构编译 SWT JNI 库。”

这让我想,“那么 Eclipse 如何能够为 Linux 制作一个万能的安装程序呢?” (也许如果我只是尝试使用这些安装程序之一,一切都会变得清晰。但有时最好问问你的更好的人。)

我试图了解使用 JNI 的 Java 项目如何处理 C++ ABI 兼容性问题。前几天问了一个类似的问题,还没有听到太多消息(Is the Java Native Interface (JNI) impacted by C++ ABI compatible issues?)。我认为 Eclipse 专家可能会给我一些指导,因为 Eclipse 可能必须处理类似的问题。

需要明确一点:Java 进程似乎基本上不能使用 C++ 库。Java 进程需要 C++ 运行时。如果一个共享库需要一个不兼容的 C++ 运行时......好吧,你现在可能明白了。

(感谢您阅读所有这些内容。)

0 投票
3 回答
18713 浏览

linux - 如何避免二进制文件中的 STT_GNU_IFUNC 符号?

我需要部署到 Red Hat 4.1.2 机器(它有 gcc 4.1.2)。我在 Ubuntu 11.10 上使用 GCC 4.6.1 进行开发。不幸的是,我的构建过程创建的一些二进制文件在 RedHat 机器上不可用。原因似乎是 ABI 更改,根据另一个 Stackoverflow 问题,这是由于引入了 STT_GNU_IFUNC 符号。有没有办法防止导出任何此类符号,以便我的二进制文件可以使用旧的 ABI?我使用 nm 在我的二进制文件中查找任何“i”类型的符号,但没有找到。

我问这个是因为我构建的一些其他二进制文件以及一些第 3 方库(tbb、boost)没有使用新的 ABI,因此在 RedHat 机器上运行良好。

希望这很清楚。提前致谢。

0 投票
2 回答
3633 浏览

c - 使用 libelf 提示生成 ELF

我正在尝试使用 libelf 生成一个简单的静态 ELF,但我似乎遇到了麻烦。

我不希望生成一个目标文件然后用 LD 链接它,而是我希望自己生成它。

该程序的主要目的是生成带有一个 LOAD 段的静态 ELF 并执行代码。

主要问题不在于 shellcode 本身,而可能在于我试图以错误的方式生成的某些标头。当我尝试运行生成的 ELF 时,它会被杀死,就好像内核无法找到它刚刚加载的段一样。

如果你们能暗示我,我会很高兴的。

create_elf.3.c

如果有人能提示我这里出了什么问题,我会很高兴

谢谢

编辑

很抱歉没有提供更多细节,

ELF 生成似乎工作正常,我没有收到任何语法错误等,但是每当我尝试运行我生成的 ELF 时,例如 ./create_elf.3 foo14 (而 foo14 是生成的 ELF)

它被杀死了,好像 execve/kernel 不想正确加载它我尝试使用 IDA 加载它,但 IDA 显示反汇编代码足够好

这是 readelf 的输出