首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 平台调用约定

在Linux平台上,函数调用约定(Calling Convention)是编程中的一个重要概念,它定义了函数参数如何被传递、返回值如何返回、寄存器如何使用以及栈帧如何构建等方面的规则。这些约定确保了不同函数之间的正确交互,特别是在涉及多个模块或库时。以下是关于Linux平台调用约定的相关信息:

调用约定基础概念

  • 定义:调用约定是一种协议,它规定了函数参数传送的方式、参数是否可变以及由谁来处理堆栈等问题。
  • 重要性:正确的调用约定对于避免函数调用错误、确保程序正确执行至关重要。

Linux平台常见的调用约定

  • System V AMD64 ABI:在Linux的x64架构下,主要的调用约定是System V AMD64 ABI,这是一种广泛使用的应用二进制接口。它详细规定了参数传递、返回值传递、寄存器使用和栈帧构建的规则。

调用约定的优势

  • 提高性能:通过优化参数传递方式,减少不必要的内存访问,提高函数调用的效率。
  • 增强可移植性:统一的调用约定使得不同编译器或不同架构之间的函数调用更加容易。
  • 确保稳定性:减少因调用约定不一致而导致的运行时错误,提高程序的稳定性。
  • 简化维护:明确的调用约定使得代码更易于理解和维护。

应用场景

  • 系统调用:如文件操作、进程管理等,这些操作通常通过系统调用实现。
  • 库函数交互:库函数之间的调用也需要遵循特定的调用约定,以确保正确传递参数和返回值。
  • 多模块编程:在复杂的软件系统中,不同模块之间的函数调用需要遵循一致的调用约定。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

调用约定

调用约定   本文内容概括自IDA pro权威指南第66页到第69页6.2.1节调用约定   调用约定指定函数调用方放置调用函数时所需参数的具体位置(如栈中、寄存器中),此外,还约定了再函数调用结束后由谁负责从栈中删除这些参数...在使用IDA的F5功能时经常能够看到函数签名中带有cdecl、fastcall等字样,这些就是调用约定。调用约定是通常是特定于语言、编译器和CPU的,这里只简单了解一下主流的调用约定。...C调用约定(cdecl)   x86体系结构的许多C编译器使用的默认调用约定叫做C调用约定(cdecl)。...标准调用约定(stdcall)   标准调用约定的“标准”是由微软为自己的调用约定所起的名称stdcall得来。...x86 fastcall调用约定 fastcall调用约定时stdcall约定的一个变体。

86940

函数调用约定

本篇原创作者:Rj45 背景 在前面的文章中,可以发现无论是x86架构还是x64架构的程序,其内部的函数在被调用时候, 都是首先将函数参数压入栈中(而且是从右向左),然后调用函数,最后还需要调整栈帧。...(x64架构的程序在使用寄存器传参的时候无需调整栈帧) 这种将函数参数顺序压入栈中以及进行栈帧调整的现象叫做函数调用约定。...函数调用约定 1、类型 函数调用约定有三种类型,分别为: __cdecl __stdcall __fastcall 2、区别 _cdecl:是C或C++默认的函数调用方式,函数参数从右向左入栈,主调函数负责栈平衡...__fastcall:是一种快速调用方式,将参数优先从寄存器传入ecx和edx,剩下的参数再从右向左入栈,被调用函数恢复栈顶指针。 栈平衡 栈平衡,也叫esp定律或者堆栈平衡。

1.9K50
  • 函数调用约定

    芯片只是规定了指令集,只要是指令集中的指令都是可以执行的正确指令,而函数是语义级别的功能块,如何让函数的大厦在指令集之上建立起来就是函数调用约定。...函数调用约定主要解决这几个问题: l 参数以什么顺序入栈或者以什么顺序进入寄存器完成传递 l 调用其它函数的时候要保存本函数的寄存器现场,谁来保存,保存哪些寄存器 l 函数退出时候要恢复调用者的寄存器现场...这对这几个问题的不同答案,有几种比较著名的约定:stdcall ,cdecl ,fastcall ,thiscall ,naked call 入栈顺序 函数命名方式 栈清理方 默认使用者...Delphi Cdel 参数全部从右向左入栈,EAX, ECX,和EDX是调用者保存,其他的寄存器是被调用者保存 调用方 C x86 EAX Syscall 从右向左入栈,...函数调用的调试 分为内核函数调用和库的调用,还有二进制文件本身的函数调用。Ptrace可以在用户层拦截和修改用户进程的系统调用。

    2.3K20

    C语言函数调用约定

    函数调用方和被调用方必须遵守同样的约定,即调用约定(Calling Convention)。...,在平时编程中,我们并没有去指定调用约定,就使用默认的 __cdecl。...除了 cdecl,还有其他调用约定: 调用约定 参数传递方式 参数出栈方式 名字修饰(编译器重命名函数) cdecl 从右到左的顺序入栈 调用方(caller) _+...被调用方(callee) @+function+@+参数的字节数 pascal 从左到右的顺序入栈 被调用方(callee) \ 调用约定 参数传递方式 参数出栈方式...x64平台,还有一些扩展… 一个函数在调用时,前四个参数是从左至右依次存放于RCX、RDX、R8、R9寄存器里面,剩下的参数从右至左顺序入栈;栈的增长方向为从高地址到低地址。

    19210

    5.5 汇编语言:函数调用约定

    说到函数我们必须要提起调用约定这个名词,而调用约定离不开栈的支持,栈在内存中是一块特殊的存储空间,遵循先进后出原则,使用push与pop指令对栈空间执行数据压入和弹出操作。...一般情况下在Win32环境默认遵循的就是STDCALL,而在Win64环境下使用的则是FastCALL,在Linux系统上则遵循SystemV的约定,这里我整理了他们之间的异同点.CDECL:C/C++...CDECL调用约定的特点是简单易用,但相比于其他调用约定,由于栈平衡的操作需要在函数返回后再进行,因此在一些情况下可能会带来一些性能上的开销。...STDCALL是一种被调用者平栈的约定,这意味着,在函数调用过程中,被调用函数使用栈来存储传递的参数,并在函数返回之前移除这些参数,这种方式可以使调用代码更短小简洁。...它通常采用被调用者平衡堆栈的方式,类似于STDCALL调用约定。但是,FASTCALL约定规定函数的前两个参数在ECX和EDX寄存器中传递,节省了压入堆栈所需的指令。

    33520

    5.5 汇编语言:函数调用约定

    说到函数我们必须要提起调用约定这个名词,而调用约定离不开栈的支持,栈在内存中是一块特殊的存储空间,遵循先进后出原则,使用push与pop指令对栈空间执行数据压入和弹出操作。...一般情况下在Win32环境默认遵循的就是STDCALL,而在Win64环境下使用的则是FastCALL,在Linux系统上则遵循SystemV的约定,这里我整理了他们之间的异同点....System V:类Linux系统默认约定,前八个参数放入(RDI,RSI, RDX, RCX, R8, R9),剩下的参数压栈保存....CDECL调用约定的特点是简单易用,但相比于其他调用约定,由于栈平衡的操作需要在函数返回后再进行,因此在一些情况下可能会带来一些性能上的开销。...它通常采用被调用者平衡堆栈的方式,类似于STDCALL调用约定。但是,FASTCALL约定规定函数的前两个参数在ECX和EDX寄存器中传递,节省了压入堆栈所需的指令。

    27620

    CC++ 反汇编:关于函数调用约定

    说到函数我们必须要提起调用约定这个名词,而调用约定离不开栈的支持,栈在内存中是一块特殊的存储空间,遵循先进后出原则,使用push与pop指令对栈空间执行数据压入和弹出操作。...一般编译器实现调用调用约定无外乎以下这几种: CDECL:C/C++默认的调用约定,调用方平栈,不定参数的函数可以使用,参数通过堆栈传递....System V:类Linux系统默认约定,前八个参数放入(RDI,RSI, RDX, RCX, R8, R9),剩下的参数压栈保存....cdecl 调用者平栈: cdecl是C/C++默认调用约定,该调用方式在函数内不进行任何平衡参数操作,而是在退出函数后对esp执行加4操作,从而实现栈平衡。...stdcall 被调用者平栈: stdcall与cdecl只在参数平衡上有所不同,其余部分都一样,但该约定不定参数函数无法使用。

    63810

    函数调用的三种约定,你都清楚吗

    其中__cdecl是C/C++默认的调用方式,__stdcall是windows API函数的调用方式,只不过我们在头文件里查看这些API的声明的时候是用了WINAPI的宏进行代替了,而这个宏其实就是_...函数的调用,涉及参数传递,返回值传递,调用后返回,这都是通过栈的变化来实现的,对于三种调用约定而言: __cdecl: C/C++默认方式,参数从右向左入栈,主调函数负责栈平衡。...下面从实例来认识一下这三种调用约定。先来看一个简单的不能再简单的程序了: ? 三个函数的内容都是一样的,不同的是使用了三种调用的方式。我们先来看看在main函数调用三个函数的时候的汇编代码: ?...调用函数之前连续进行了两次push操作将函数所需的实参5和2先后压入了栈区,调用完成后,我们需要恢复调用前的状态,则需调整栈顶指针esp的位置,这一工作由谁来完成就决定了两种函数调用方式__cdecl(...这样,不需要主调函数再调用add指令为ESP操作平衡栈区,节约了程序的开销,一条指令开销小,如果十万百万个这样的调用,这个开销就明显了。

    1.5K11

    python调用调用Linux命令

    如何调用Linux命令 下面代码演示了调用一个shell命令, 其中,命令的输出会存储到result变量中, 而命令的返回值,则存储到exitcode中,由此可见,调用shell命令还是很方便的: import...add函数: import ctypes plib = ctypes.CDLL('/tmp/api.so') print "result: %d" %(plib.add(1,2)) 系统调用 虽然需求好像有点...“过份”,但是强大的python是可以调用诸如ioctl这类的Linux系统调用的, 以下的例子是让蜂鸣器响: import fcntl fd = open('/dev/pwm', 'r') fcntl.ioctl...(fd, 1, 100) 等效于以下c代码 int fd = open("/dev/pwm", O_RDONLY); ioctl(fd, 1, 100); IDE 我只用过 PyCharm,跨平台的,...它是一个事务型的对象数据库平台 Zope的管理面板首页Zope除了能储存内容,数据外,还能存放动态的HTML模板、脚本、搜索引擎、关系数据库管理系统(RDBMS)接口和代码。zope里的一切都是对象。

    5.2K20

    【Linux】Linux系统调用

    Linux系统调用 前言 操作系统——管理计算机硬件与软件资源的软件,是用户和系统交互的操作接口,为它上面运行的程序提供服务。...例如Linux。 Linux操作系统——基于Linux内核的操作系统。通常由Linux内核、shell(特殊的应用程序,提供运行其他程序的接口)、文件系统和应用程序组成。...Linux的运行空间: Linux的运行空间:内核空间+用户空间 ---- 内核空间——存放的是整个内核代码和所有内核模块,以及内核所维护的数据。 用户空间——用户程序的代码和数据。...使用户程序具有可移植性 对于不同平台不同硬件来说。 ---- 系统调用的实现 通过软件中断实现。 **软件中断:**它是通过软件指令触发的中断。...Linux系统内核响应软件中断,从用户态切换到内核态,执行相应的系统调用。

    27.9K10

    【Chromium中文文档】跨平台开发的约定与模式

    Linux文件中,低层级文件使用_linux后缀,GTK相关文件使用_gtk后缀,X Windows(不使用GTK)特定文件使用_x后缀。 Windows文件使用_win后缀。...Mac,iOS和Linux共享的Posix文件使用_posix后缀。 Chrome view UI相关布局系统文件(在Windows和实验室环境GTK上)使用_views后缀。...独立的浏览器后端文件放在他们自己的目录里: Mac Cocoa: chrome/browser/ui/cocoa Linux GTK: chrome/browser/ui/gtk Windows Views...如果在这个类里有跨平台的函数,他们应该被丢到一个名为base/waitable_event.cc的函数。 全平台实现和调用器:隔离实现 当抽象层面没有东西实现,就要在每个单独的文件里分别实现类。...,我们已经在不同的文件里定义了一个普通命名的类,所以PlatformDevice定义在skia/ext/platform_device_win.h, skia/ext/platform_device_linux.h

    1.6K90

    Flutter调用平台代码

    宿主监听的平台通道,并接收该消息。然后它会调用特定于该平台的API(使用原生编程语言) - 并将响应发送回客户端,即应用程序的Flutter部分。...接下来我们来个例子看看 调用Android平台Toast ---- 在自前面我们可以很清楚的看到在Android平台我们需要借助于MethodChannel来与Android平台代码交互。...然后,我们同个通道来调用在Android平台定义的方法 使用platform.invokeMethod(“showToast”,{“msg”:msg})来调用我们在Android平台定义的“showToast...从Android平台获取数据 ---- 和上面的类似,我们可以调用系统的方法,我们同样刻印调用我们自己写的方法并且返回调用方法的值,那么我们还是举个例子看下吧。...我们通过flutter调用Android平台的方法获取当前格式化好的时间。 同样的我们还是用用和刚才一样的通道,只不过这一次我们需要更改我们调用的方法即可。

    2.1K30
    领券