assembly - 遵循 ABI 进行模块本地调用的目的是什么?它甚至在哪里执行?
问题描述
我知道 ABI 是一种非语言特定的构造,它定义了诸如数据从一个函数传递到另一个函数的方式。遵守此类 ABI 是编译器的工作。我也了解 ABI 如何对模块间调用有用,例如,调用 .dll,就好像我们没有明确定义的调用约定一样,就没有可靠的方法来传递数据.
我迷路的地方是没有外部引用的函数的目的。编译器不能为每个函数创建自己的任意调用约定吗?我已经看到编译器产生了对现有调用约定的奇怪修改版本。为了进一步混淆,x64 调用约定的官方文档通常使用非常严格的语言,例如:
函数调用的参数和用于这些参数的寄存器之间存在严格的一一对应关系。
然而,至少在 __thiscall 等 x86 调用约定中,我已经看到编译器在没有外部引用的函数中违反了它们的约定。那么,为什么这些约定甚至存在于没有外部引用的函数中,如果在这种情况下违反它们会发生什么?
解决方案
对于没有外部引用的函数,编译器没有严格的要求遵循 ABI,它可以自由选择,但违反 ABI 的收益通常是微不足道的,这使得优化不值得努力实现。
推荐阅读
- html - 什么时候最好使用 HTML 表示标签或 CSS 来设置元素样式?
- javascript - 如何在 XPath 中的特定字符串之后复制第一个表?
- javascript - 如何将“字符串”数据附加到本地存储
- r - 过滤反应函数时的问题
- docker - 如何修复 Jenkins 中的 Maven 权限问题
- php - Sonata Admin 中的多个嵌套集合字段
- swift - 索引路径在被调用后不放置图像
- docker - 从 Ubuntu 到 RaspberryPi 创建 Docker 机器时卡在“等待 SSH 可用”
- typescript - 默认导出未明确定义
- php - PHP Lumen:在 API 测试中忽略中间件