system V ABI

2024-01-22 08:59
文章标签 system abi

本文主要是介绍system V ABI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

system V ABI

译自 system V ABI

System V应用程序二进制接口是一组规范,详细说明了调用约定,目标文件格式,可执行文件格式,动态链接语义,以及符合X / Open通用应用程序环境规范和System V接口定义的系统的更多规范。现在,它已成为主要的Unix操作系统(例如Linux,BSD系统和许多其他操作系统)使用的标准ABI。 可执行和可链接格式(ELF)是System V ABI的一部分。

ABI被组织为可移植的基础文档和针对特定平台的补充。 由于格式已适应新平台(例如X86-64),因此已经发布了非官方的新体系结构处理器补充。 该标准是可扩展的,并且格式随着Unix供应商添加新功能而不断发展。 由于存在许多非官方的补充规范以及Unix操作系统的混乱历史,当前的情况是System V ABI已成为一系列非官方的草案规范,而没有真正的中央管理机构。

许多高级功能(例如动态链接)是可选的,并且加载简单的静态链接的ELF程序非常简单。 该标准的早期版本更加雄心勃勃,并试图标准化软件包安装格式和X11详细信息,而今天已经忽略了这些过时的详细信息。 常见的操作系统开发工具(例如Binutils和GCC)对ABI有很好的支持。 诸如i686-elf-gcc之类的工具链会根据此ABI生成代码和可执行文件。

可执行和可链接格式

可执行和可链接格式在System V ABI中被标准化为可修改的文件格式。处理器补充通过声明ELF格式结构中使用的抽象类型的大小以及字节序,可以巧妙地更改文件格式。 这使框架文件格式适用于多种处理器体系结构,其中通过简单地增加各种标头字段的大小来处理32位和64位系统之间的差异。 该格式足够强大,可以包含辅助信息,例如调试信息,动态库的重定位以及其他特定于供应商的其他信息。 这允许对目标文件和链接的可执行文件使用相同的格式。

调用约定
这是System V ABI主要体系结构的重要调用约定详细信息的简短描述。 所列出的信息并不完整,您应查阅相关的处理器补充文件(psABI)以了解详细信息。 此外,您可以使用编译器的-S选项在调用汇编器之前停止编译过程,这使您可以研究编译器如何按照相关的调用约定将代码转换为汇编。

  • i 386
    这是一个32位平台。 堆栈向下生长。 函数的参数以相反的顺序传递到堆栈上,以便第一个参数是被压入堆栈的最后一个值,然后将成为堆栈上的最小值(译注:这里的值指地址)。 可以通过修改被调函数的参数来修改在堆栈上传递的参数。 使用call指令来调用函数,该指令将下一条指令的地址压入堆栈并跳转到操作数。 函数使用ret指令返回调用者,该指令从堆栈中弹出一个值并跳转到该值。 在调用call指令之前,堆栈是16字节对齐的。

    函数保留寄存器ebxesiediebpesp; 而eaxecxedx是暂存器。 返回值存储在eax寄存器中,或者如果返回值是64位的,则高32位进入edx,低32位进入eax。 被调函数将ebp推入堆栈,这样紧挨着主调函数栈帧的栈顶,即此时caller-return-eip位于ebp上方4个字节处,然后将ebp设置为已保存ebp的地址。 这允许遍历现有堆栈帧。 通过指定-fomit-frame-pointer GCC选项可以消除此问题。

    作为特殊的例外,GCC假定堆栈未正确对齐,并在输入main或在函数上设置了属性((force_align_arg_pointer))时将其重新对齐。

  • x86-64
    这是一个64位平台。 堆栈向下生长。 函数的参数在寄存器rdi,rsi,rdx,rcx,r8,r9中传递,并且其他值以相反的顺序在堆栈中传递。译注前6个从左到右依次放入rdi,rsi,rdx,rcx,r8,r9超出6个的参数从右向左放入栈中。可以通过修改被调用函数的参数来修改在堆栈上传递的参数。 使用call指令来调用函数,该指令将下一条指令的地址压入堆栈并跳转到操作数。 被调函数使用ret指令返回调用者,该指令从堆栈中弹出一个值并跳转到该值。 在调用调用指令之前,堆栈是16字节对齐的。

    函数保留寄存器rbxrsprbpr12r13r14r15raxrdirsirdxrcxr8r9r10r11是暂存寄存器。 返回值存储在rax寄存器中,或者如果它是128位值,则高64位进入rdx。 可选地,被调函数推入rbp,以使caller-return-rip在其上方8个字节,并将rbp设置为已保存的rbp的地址。 这允许遍历现有堆栈帧。 通过指定-fomit-frame-pointer GCC选项可以消除此问题。

    信号处理程序在同一堆栈上执行,但是在将任何内容压入堆栈之前,会从堆栈中减去称为红色区域的128个字节。 这允许小的叶子函数使用128字节的堆栈空间,而无需通过从堆栈指针中减去来保留堆栈空间。 众所周知,红色区域会给x86-64内核开发人员造成问题,因为在调用中断处理程序时,CPU本身并不尊重红色区域。 由于ABI与CPU行为相矛盾,这会导致微妙的内核损坏。 解决方案是使用-mno-red-zone或通过在内核模式下在当前堆栈以外的其他堆栈上处理中断来构建所有内核代码(从而实现ABI)。

叶子函数参考

  • Handling Leaf Functions
  • 叶和非叶

在这里插入图片描述

这篇关于system V ABI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/632496

相关文章

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

Partical System

创建"粒子系统物体"(点击菜单GameObject -> Create Other -> Particle System) 添加"粒子系统组件"(点击Component -> Effects  ->Particle System) 粒子系统检视面板  点击粒子系统检视面板的右上角的"+"来增加新的模块。(Show All Modules:显示全部) 初始化模块: •

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

System.getProperties().

Java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

android6/7 system打包脚本

1.android5打包system就是网站上常见的制作ROM必备的解包打包system脚本 指令如下:mkuserimg.sh -s out/target/product/$TARGET_PRODUCT/system out/target/product/$TARGET_PRODUCT/obj/PACKAGING/systemimage_intermediates/system.img

android打包解包boot.img,system.img

原帖地址:http://www.52pojie.cn/thread-488025-1-1.html 转载Mark一下,日后研究 最近工作需要对boot.img,system.img进行破解。顺便将心得分享一下。 我的工作环境是在linux下的。所以工具都是针对linux的。 boot.img破解相关工具: 1、split_boot    perl脚本 2、boot_i

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

Linux函数fcntl/system学习

本文针对项目中用到的几个函数进行详细分析,并尽可能的添加示例进行验证学习。比如fcntl/ioctl函数、system/exec函数、popen/pclose函数、mmap函数等。 重点参考了《UNP》和《Linux程序设计》第四版。 一、fcntl函数 fcntl函数可以改变或者查看已打开文件的性质。该函数的定义如下: #include <fcntl.h> int fcntl(

【UVA】11400-Lighting System Design(动态规划)

这道题感觉状态式不是很好推。。。 WA了好几次是因为排序的时候出问题了。 这道题出在线性结构里了,先说一下最长上升子序列吧。 dp[i]代表了以array[i]结尾的时候,最长子序列长度。 推导的时候,以起点递增的顺序进行推导。 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#i