IA-64 中的“GP/功能地址对”是什么意思?

2024-02-25

“GP/函数地址对”是什么意思安腾 C++ ABI http://mentorembedded.github.io/cxx-abi/abi.html#member-pointers? GP 代表什么?


简短说明:gp对于所有实际方法来说,它是所有符合 Itanium ABI 的函数的隐藏参数。这是一种this指向函数使用的全局变量的指针。据我所知,目前还没有主流操作系统做到这一点。

GP 代表“全局指针”。它是由可执行文件静态分配的数据的基地址,Itanium 架构有一个专门用于它的寄存器。

例如,如果您的程序中有这些全局变量和此函数:

int foo;
int bar;
int baz;

int func()
{
    foo++;
    bar += foo;
    baz *= bar / foo;
    return foo + bar + baz;
}

gp/函数对在概念上是&foo, &func。生成的代码为func会指gp找到全局变量所在的位置。编译器知道foo可以在以下位置找到gp, bar可以在以下位置找到gp + 4 and baz可以在以下位置找到gp + 8.

假设func是在外部库中定义的,如果您从程序中调用它,编译器将使用如下指令序列:

  • 将当前gp值保存到堆栈中;
  • 从该对加载代码地址func进入某个寄存器;
  • 将同一对的 gp 值加载到 GP 中;
  • 对我们存储代码地址的寄存器进行间接调用;
  • 恢复我们之前保存在堆栈中的旧 gp 值,恢复调用函数。

这使得可执行文件完全位置无关,因为它们从不存储数据符号的绝对地址,因此可以在内存中仅维护任何可执行文件的一个实例,无论有多少进程使用它(您甚至可以加载在一个进程中多次执行相同的可执行文件,并且系统范围内仍然只有一份可执行代码的副本),代价是使函数指针有点奇怪。对于 Itanium ABI,函数指针不是代码地址(就像“常规”x86 ABI 一样):它是 gp 值和代码地址的地址,因为如果可以的话,该代码地址可能没有多大价值。无法访问其全局变量,就像一个方法如果没有一个方法可能无法做很多事情一样this指针。

我知道的唯一使用此概念的其他 ABI 是 Mac OS Classic PowerPC ABI。他们将这些对称为“转移向量”。

由于 x86_64 支持 RIP 相对寻址(x86 没有等效的 EIP 相对寻址),因此现在可以非常轻松地创建与位置无关的代码,而无需使用额外的寄存器或使用“增强型”函数指针。代码和数据只需保持恒定的偏移量即可。因此,安腾 ABI 的这一部分可能在英特尔平台上永远消失了。

来自安腾寄存器约定 http://people.cs.pitt.edu/%7Emock/cs2210/handouts/itanium-register-convention.pdf:

8.2 gp寄存器

每个引用静态分配数据或调用另一个过程的过程都需要一个指向 gp 寄存器中其数据段的指针,以便它可以访问其静态数据及其链接表。每个加载模块都有自己的数据段,并且在调用该加载模块内的任何入口点之前必须正确设置 gp 寄存器。

链接约定要求每个加载模块精确定义一个 gp 值来引用其短数据段内的位置。预计该位置将被选择为最大化用于寻址标量和链接表条目的短位移立即指令的有用性。 DLL加载器将其数据段加载到内存后,将确定每个加载模块的gp寄存器的绝对值。

对于加载模块内的调用,gp 寄存器将保持不变,因此可以相应地优化已知的本地调用。

对于加载模块之间的调用,必须使用新加载模块的正确 gp 值初始化 gp 寄存器,并且调用函数必须确保保存和恢复其自己的 gp 值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IA-64 中的“GP/功能地址对”是什么意思? 的相关文章

  • 为什么共享库的 ELF 标头会将 Linux 指定为 OSABI?

    我的 Linux 系统 Fedora 9 上的所有标准共享库都指定 ELFOSABI NONE 0 作为其 OSABI 这很好 但是我从供应商那里收到了一个共享库 其中 ELF 标头中给出的 OSABI 是 ELFOSABI LINUX 3
  • 了解堆栈对齐强制

    考虑以下 C 代码 include
  • C++ 当从函数返回结构体时,汇编中实际发生了什么?

    我试图弄清楚如果从函数中按值返回结构 而不是返回指向该结构的指针 那么在 C 中实际会发生什么 如果函数只能返回适合寄存器的值 那么当按值发送结构时 如何进行通信 我在某处读到过 我尝试在 Godbolt 上测试它 看看它在做什么 但我不了
  • C 有标准的 ABI 吗?

    来自讨论别的地方 C 没有标准的ABI 应用程序二进制接口 但C也没有 对吗 在任何给定的平台上它几乎都是如此 如果缺乏一种语言 它就无法作为跨语言交流的通用语言 您对此有何看法 C 没有定义 ABI 事实上 它竭尽全力避免定义 ABI 像
  • 每个 CPU 架构的真正 ELF TLS ABI 要求是什么?

    乌尔里希 德雷珀的论文on thread local storage 概述了几种不同 cpu 架构的 TLS ABI 但我发现它不足以作为实现 TLS 的基础 原因有两个 它省略了许多重要的体系结构 如 ARM MIPS 等 同时包括一堆完
  • System V 中 x86_64 的 C 浮点值调用约定是什么?

    我目前正在深入研究汇编领域 主要是从 x86 64 C 和 System V AMD64 的角度 通常针对 Linux 通过按顺序使用以下寄存器 整数 以及隐含的指针 值的调用约定非常简单 RDI RSI RDX RCX R8 R9 XMM
  • x86、x32 和 x64 架构之间的区别?

    请解释一下两者的区别x86 x32 and x64 说到这里有点令人困惑x86 and x32因为大多数时候 32 位程序在 x86 上运行 Hans 和 DarkDust 的回答涵盖了 i386 i686 和 amd64 x86 64 因
  • i386 和 x86-64 上的 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么

    以下链接解释了 UNIX BSD 风格 和 Linux 的 x86 32 系统调用约定 http www int80h org bsdasm system calls http www freebsd org doc en books de
  • 如何让 cx_Oracle 在 64 位 Itanium Windows 上工作?

    我在 64 位 Itanium 服务器上运行 Windows Server 2003 该服务器还运行 64 位 Oracle 10 2 并且我想安装适用于 Python 2 5 的 cx Oracle 我之前在 Windows 和 Linu
  • 带有 LLVM 的 C ABI

    我有一个用 LLVM 编写的编译器 我希望提高 ABI 合规性 例如 我发现很难在 Windows x86 或 Linux 上实际找到 C ABI 的规范文档 我发现的那些用 RAX EAX 等术语解释它 而不是我可以使用的 IR 术语 到
  • arm64-v8a 与armeabi-v7a 兼容吗?

    对于我的 Android 应用程序 我现在使用 ABI x86 和 armeabi armeabi 适用于所有 ARM 设备 包括armv7a 和arm64 v8a 现在我想删除 armeabi 并继续使用 x86 和 armeabi v7
  • x86-64 上的 C++:何时在寄存器中传递和返回结构/类?

    假设 Linux 上的 x86 64 ABI 在 C 中的什么条件下 结构会传递给寄存器中的函数 还是传递给堆栈上的函数 在什么条件下它们会返回到寄存器中 答案会随着课程的变化而变化吗 如果有助于简化答案 您可以假设单个参数 返回值并且没有
  • Solidity如何使用元组(嵌套abi)进行函数签名?

    struct Test uint ui string s function test Test t public emit Log t ui t s 我对ABI有一些了解 我使用实验性 ABIEncoderV2 选项签订了这份合同 总之 这
  • API 和 ABI 之间的区别

    我是 Linux 系统编程新手 在阅读时遇到了 API 和 ABILinux系统编程 API定义 API 定义了接口 通过这些接口 一个软件可以进行通信 与源级别的另一个 ABI的定义 而 API 定义了源 接口 ABI 定义了 两者之间的
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • AMD64 ABI 中的空类会发生什么情况?

    我正在看AMD64 ABI http www cs tufts edu comp 40 readings amd64 abi pdf并且它似乎没有指定如何传递空类类型 对于空类成员函数 似乎this照常传递 但对于空类 Clang 生成的代
  • 在 FFI 中使用 ptr::NonNull 是否有效?

    铁锈具有ptr NonNull https doc rust lang org beta std ptr struct NonNull html代表非的类型NULL指针 在 FFI 中使用这种类型安全吗 是否保证具有相同的二进制表示形式 忽
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • Google Play 商店中不支持的设备 - Flutter

    我已将我的应用程序上传到谷歌商店 但我的一些朋友无法安装它 他们得到 您的设备与此版本不兼容 我已经检查了sdk 屏幕尺寸和权限要求 也将uses features required设置为false 但仍然有一些设备无法安装它 我在游戏控制
  • 通过 cmake 链接 libc++ 时 libc++abi 的链接问题

    我正在尝试构建一个简单的 hello world C 使用 LLVM Clang 3 7 0 的程序 根据工具链的源代码构建libc 使用命令行 clang std c 14 stdlib libc fno exceptions hello

随机推荐

  • Delphi XML 数据绑定错误:“未知数据类型”

    我正在尝试从导入的架构中导入包含一些复杂文件的 XSD 文件 XML 数据绑定向导给我一个 未知数据类型 错误 我在几个论坛中看到这个问题 但目前还没有解决方案 这是文件 http www sii cl factura electronic
  • Android 12 上的 apk 安装失败

    compileSdkVersion 31 defaultConfig minSdkVersion 20 targetSdkVersion 31 构建或组装调试效果良好 但是安装APK时出现 解析包错误时出现问题 当我查找时 我看到将 and
  • 如何在 Visual Studio Code 中为 C++ 启用漂亮打印?

    我正在尝试使用 MinGW GDB python 调试器在 Visual Studio Code 中启用 C 的漂亮打印 我按照描述的步骤操作here https stackoverflow com questions 4985414 ho
  • 检查显示器是否已连接

    我必须制作一个简单的程序 向服务器报告显示器的状态 是开 关还是只是未连接 到目前为止 我正在使用在另一个讨论中找到的这种方法 但它每次都会返回 true 即使我已经断开了显示器的连接 public static Boolean isMon
  • getJSON 同步

    目标 我所追求的是每次在数据库中添加某些内容时 在 ajax 到 Submit to db php 之后 从数据库获取数据并刷新 main php 通过 draw polygon 更明显 所以基本上我有一个main php 它将ajax调用
  • 数据表在编辑后不记得分页页面

    我一直在使用 DataTable 服务器端处理 我的数据表有编辑列 当编辑链接时 单击 jQuery 对话框将出现 提交后对话框将关闭并调用 ajax reload 但是 当我在分页中执行此操作时 如果我在 ajax reload 之后在第
  • AS3 功能点击按钮后开始下载!

    我的网站需要一个 ActionScript 3 函数 让人们在单击按钮后下载文档 在网上任何地方都找不到这个 谢谢 詹妮弗 文件参考 下载 http livedocs adobe com flash 9 0 ActionScriptLang
  • 使用 64 位包编译 32 位 Qt 应用程序

    我使用的是 Windows 8 64 位 Qt 5 0 2 for Windows 64 位和 Visual Studio 2012 我在 64 位操作系统上编译和运行我的应用程序没有遇到任何问题 但显然它不适用于 32 位操作系统 有没有
  • 如何使用 JWT 为 Google firebase 生成身份验证令牌?

    所以我正在努力对 Firebase REST API 进行身份验证 https firebase google com docs database rest auth我正在使用蒸气框架 https vapor codes对于服务器端 swi
  • 存储过程中关键字 '.未闭合引号附近的语法不正确

    我有 2 个表和 2 个存储过程 在这两个存储过程中 我有相同的插入数据代码 从一个存储过程中 我在插入相同数据时收到错误 信息 Testing is going on Let s find out it 我将一个值从 C 代码隐藏直接传递
  • Polars的replace_time_zone函数抛出“没有这样的当地时间”的错误

    这是我们要使用的测试数据 import polars as pl import pandas as pd from datetime import date time datetime df pl DataFrame pl date ran
  • 带命名空间的 PHPUnit getMock()

    我对开始在 PHP 中使用名称空间的追求仍在继续 这次 PHPUnit 给我带来了问题 我的 setup 方法是这样的 test new MyNamespace NonPersistentStorage works mock this gt
  • 将多种日期格式解析为单一格式

    我有一个名为 已发布 日期 的专栏 正如您所看到的 它有多种日期格式和 nan 值 我想跳过 nan 值 将所有其他格式转换为 Y d 并忽略具有唯一年份的格式 我尝试了 df publish time pd to datetime df
  • 为什么Python语言没有writeln()方法?

    如果我们需要向文件写入新行 我们必须编写以下代码 file output write Fooo line n Python 没有任何原因吗 writeln method 在 Python 2 中 使用 print gt gt file ou
  • 使用 jQuery ajax 提交表单

    表单未使用 ajax form 在单击 li 时提交 给我一些解决方案 我的js代码在这里 document ready function sortable li click function frmgallery submit funct
  • 我可以使用 WiX 设置自定义许可证吗?

    WiX 生成的 MSI 的默认许可证是通用公共许可证 如何将其更改为 GPLv2 The Wix变量 http wix sourceforge net manual wix3 wix xsd wixvariable htm XML元素 ht
  • 使用 C# 从完整结果集变量获取数据到脚本任务

    我需要使用脚本任务将数据从 SQL 任务获取到 DataTable 对象以生成电子邮件 但是当我尝试使用 OLEDB 适配器填充任务填充数据时 它会生成错误 OleDbDataAdapter 内部错误 行集访问器无效 Ordinal 1 S
  • 从列中的字符串中去除空格

    我正在使用Pythoncsvkit比较 2 个文件 如下所示 df1 pd read csv input1 csv sep s delimiter encoding utf 8 df2 pd read csv input2 csv sep
  • 我怎样才能看到我的delphi应用程序当前使用了多少堆栈空间?

    我怎样才能看到我的delphi应用程序当前使用了多少堆栈空间 我曾有一个very奇怪的错误听起来像是堆栈问题 我想将其添加到我的应用程序日志中 以了解正在使用 剩余的堆栈空间有多少 使用调试器可能不太好 因为可以多次调用例程 谢谢你 这应该
  • IA-64 中的“GP/功能地址对”是什么意思?

    GP 函数地址对 是什么意思安腾 C ABI http mentorembedded github io cxx abi abi html member pointers GP 代表什么 简短说明 gp对于所有实际方法来说 它是所有符合 I