ARM GCC 生成函数序言

2024-02-07

我提到 ARM 工具链可以生成不同的函数序言。实际上,我看到两个 obj 文件(vmlinux)具有完全不同的函数序言:

第一种情况如下所示:

push {some registers maybe, fp, lr} (lr ommited in leaf function)

第二种情况如下所示:

push {some registers maybe, fp, sp, lr, pc} (i can confuse the order)

所以我看到第二个额外推动了 pc 和 sp。另外,我在崩溃实用程序(kdump 项目)中看到了一些评论,其中指出,内核堆栈帧应该具有格式 {..., fp, sp, lr, pc} 这让我更加困惑,因为我发现在某些情况下它不是真的。

1.) 我关于在函数序言中额外推送 pc 和 sp 需要一些 gcc 额外标志的说法正确吗?如果是的话,它们是什么?

2.) 这是做什么用的?基本上,据我所知,我只能使用 FP 和 LR 来展开堆栈,为什么我需要这个附加值?

3.)如果这件事与编译标志无关 - 我如何强制生成此扩展函数序言,目的是什么?

谢谢。


1.) 我关于在函数序言中额外推送 pc 和 sp 需要一些 gcc 额外标志的说法正确吗?如果是的话,它们是什么?

有许多 gcc 选项会影响堆栈帧(-march, -mtune等可能会影响所使用的指令)。就你而言,它是-mapcs-frame。还,-fomit-frame-pointer将从叶函数中删除框架。多个静态函数可以合并到一个生成函数中,进一步减少帧数。这APCS http://www.cl.cam.ac.uk/~fms27/teaching/2001-02/arm-project/02-sort/apcs.txt可能会导致代码稍微慢一些,但对于堆栈跟踪来说是必需的。

2.) 这是做什么用的?基本上,据我所知,我只能使用 FP 和 LR 来展开堆栈,为什么我需要这个附加值?

所有非参数(r0-r3)的寄存器都需要保存,因为它们在返回给调用者时需要恢复。编译器将在堆栈上分配额外的局部变量,因此sp几乎总是会改变的时候fp变化。为何pc已存储,见下文。

3.)如果这件事与编译标志无关 - 我如何强制生成此扩展函数序言,目的是什么?

正如您所猜测的,它是编译器标志。

; Prologue - setup
mov     ip, sp                 ; get a copy of sp.
stm     sp!, {fp, ip, lr, pc}  ; Save the frame on the stack. See Addendum
sub     fp, ip, #4             ; Set the new frame pointer.
    ...
; Epilogue - return
ldm     sp, {fp, sp, lr}       ; restore stack, frame pointer and old link.
    ...                        ; maybe more stuff here.
bx      lr                     ; return.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM GCC 生成函数序言 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • gcc,我可以将 offsetof() 与指向成员的模板化指针一起使用吗?

    下面的代码在这里 https ideone com XnxAyw https ideone com XnxAyw 我得到的编译器错误是 prog cpp In member function size t list base
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • canvas.toDataURL() 不是函数 - 错误 node-webGL 包装器

    目前我正在尝试将基于浏览器的客户端体积渲染代码转换为服务器端纯基于 JavaScript 的渲染 我在服务器端使用node webgl 我的主要目标是将服务器的画布内容发送到客户端 然后将该图像数据显示在客户端上 但在此之前我需要检查渲染是
  • mysql 5.7 日志慢查询错误

    我试图在 mysql 5 7 上启用慢查询日志记录并收到此错误 2016 04 27T14 55 51 934612Z 0 错误 未知变量 log slow queries var log mysql query log 2016 04 2
  • 谷歌地图删除所有标记,然后创建新的

    我正在创建一个地图 默认情况下加载地址并显示标记并在搜索框中放置地址 效果很好 但我需要添加单击事件 该事件将首先删除所有标记 然后放置标记 到目前为止 我正在开发满足我需要的所有脚本 但是 当用户单击地图时 搜索框会获取地点地址 但旧标记
  • 为什么这两个代码变体会产生不同的浮点结果?

    给出这个示例 C 代码片段 void floatSurprise these come from some sort of calculation int a 18680 b 3323524 c 121 float m float a c
  • 在R中使用geom_line时显示不正确

    给定一个数据框如下 v1 v2 v3 v4 Tom A Jim B Gary A Shirly A Shirly B Jack B Tom A Jack B v2和v4分别表示v1和v3中的名称属于哪个组 汤姆属于 A 组 吉姆属于 v4
  • 如何检查 JTabbedPane 中的选项卡是否处于活动状态?

    如何检查 JTabbedPane 实例中的选项卡是否处于活动状态 在选项卡 嵌套类 本身的类中而不是在封闭类中 我知道有一个方法booloean isEnabledAt int index 但该方法只能在封闭类中调用 而我想检查当前是否在选
  • 如何进行多线程复制文件

    我想将多个文件复制到一个文件中 但是使用多线程 假设文件A是不同线程复制数据的文件 在这种情况下 每个线程都意味着复制文件A中的一个文件 使用以下过程 procedure ConcatenateFiles const InFileNames
  • 曲面算术/四叉树

    我不久前做了一个使用四叉树进行路径查找的项目 我想提高它的性能 似乎使用 tesseral 算术来确定节点邻接 根据这一页 http www geog ubc ca courses klink gis notes ncgia u37 htm
  • 使用动态转储 ComObject 对象?

    我正在尝试 不幸的是 为我在 Office 类型库中访问的对象实现 对象转储器 这一定是可能的 因为 VS 的调试窗口有一个针对 System ComObject 对象的 动态视图 它可以有效地执行我想要的操作 有任何想法吗 我还创建了一个
  • 如何使小部件填充列中的剩余空间

    在Android中 我们可以执行以下操作来制作ImageView根据物体的大小 填充尽可能多的空间TextView
  • Perl 的 XSLT2.0 处理器?

    是否有适用于 Perl 的强大 XSLT2 0 处理器 我刚刚尝试了 XML LibXSLT 它不支持分析字符串 正则表达式等 我害怕在我的工作中使用 XML Saxon XSLT2 因为它使用 Java 我不想添加添加到我的依赖项列表中
  • 将字符串直接拆分为变量

    我想知道标准 JS 是否提供了一种在初始声明期间将字符串直接拆分为一组变量的方法 例如在 Perl 中我会使用 my a b c split str 在 Firefox 中我可以写 var a b c str split 但此语法不是 EC
  • 如何在oozie作业中指定多个libpath?

    我的 oozie 工作使用 2 个 jarx jar and y jar以下是我的 job properties 文件 oozie libpath lib oozie use system libpath true 当两个 jar 都位于
  • 如何将输入图像提供给经过训练的模型?预期 input_1 有 4 个维度,但得到的数组形状为 (224, 224, 3)

    import tensorflow as tf from tensorflow import keras from keras models import load model from keras preprocessing import
  • 如何使用 Inno Setup 更改可执行文件权限?

    我通过 InnoIDE 中的向导创建了一个非常简单的 inno 脚本 但是 普通用户可以运行部署的可执行文件 如何强制用户必须通过脚本以管理员身份运行它 Setup AppId 03E6645E 2C53 4E90 967B D0833A8
  • std::string size() 是 O(1) 操作吗?

    std string size 是 O 1 操作吗 我使用的STL实现是VC 中内置的 如果您问 MSVC 的 string size 实现是否具有恒定的复杂性 那么答案是肯定的 但唐 韦克菲尔德 https stackoverflow c
  • Java - 父类正在调用子类的方法?

    抱歉 我对编码还很陌生 可能还没有掌握所有术语 希望您仍然能理解我的问题 我想要得到的输出是 Cost for Parent is 77 77 Cost for Child is 33 33 但是 我得到了这个 Cost for Paren
  • Angular - Prod Build 不生成唯一的哈希值

    Angular 生产构建不会在我的项目中生成唯一的哈希值 以下是构建日志截图 无法在新的 Angular cli 项目中重现此问题 似乎我的项目中存在一些问题 我正在使用角度 6 0 3 下面是 angular json schema no
  • Office 365 Rest API 读取“回复”字段

    我正在使用此处记录的其余 APIhttps msdn microsoft com office office365 APi mail rest operations https msdn microsoft com office offic
  • ARM GCC 生成函数序言

    我提到 ARM 工具链可以生成不同的函数序言 实际上 我看到两个 obj 文件 vmlinux 具有完全不同的函数序言 第一种情况如下所示 push some registers maybe fp lr lr ommited in leaf