GNU ARM 中 get_pc() 的声明在哪里?
Posted
技术标签:
【中文标题】GNU ARM 中 get_pc() 的声明在哪里?【英文标题】:Where is declaration for get_pc() in GNU ARM? 【发布时间】:2011-12-21 10:40:10 【问题描述】:我正在使用 GNUARM C 编译器构建遗留代码并尝试解析函数的所有隐式声明。
我遇到了一些 ARM 特定的函数,但找不到包含这些函数声明的头文件:
get_pc
get_cpsr
get_sp
我在网上搜索了一下,只找到了包含这些函数的源代码,没有任何非标准的包含文件。
我也会满足于函数声明。
由于我还将代码移植到 Cygwin / Windows 平台,Cygwin GNU GCC 的等效声明是什么?
谢谢。
【问题讨论】:
它们是如何使用的?它们具有 x86 等效项(%eip、eflags 和 %esp),但直接翻译不太可能产生所需的结果,除非它只是用于调试。 它们被用作自检的一部分。程序将读取堆栈指针寄存器,并确定堆栈是否溢出。 【参考方案1】:如果你真的需要这些功能就自己写吧,asm 比 inline asm 容易:
.globl get_pc
get_pc:
mov r0,pc
bx lr
.globl get_sp
get_sp:
mov r0,sp
bx lr
.globl get_cpsr
get_cpsr:
mrs r0,cpsr
bx lr
至少对于手臂。如果您要移植到 x86 并需要等价物,那么我不得不想知道这些东西的代码需要什么。特别是 cpsr,您可能不得不更改任何使用结果作为跨处理器供应商/系列的状态寄存器的代码,几乎永远不会匹配。 x86 等价物的工作量仍应大致相同,比仅编写代码(如果您了解处理器)需要更长的时间进行 google 搜索和读取结果。
根据您的应用程序正在执行的操作,最好只注释掉调用这些函数和/或使用返回值的任何代码。我可以想象为什么会使用这些项目的几个原因,但它可能会涉及特定于架构的东西,这比仅仅移植一些寄存器读取功能更复杂。所以user786653问的是关键问题。这些功能是如何使用的?不是我在哪里可以找到它们,而是它们是如何使用的以及您认为为什么需要它们。
【讨论】:
问题不在于编写这些函数。问题是找到这些函数的声明以删除编译器警告。 都是32位寄存器,uint32_t get_pc(void) uint32_t get_sp()等应该可以吧?get_pc
函数应该有mov r0,lr
或者它总是返回get_pc
函数的地址。另外,请注意,这将返回未针对 ARM 的“管道效应”调整的 PC 值,这可能是也可能不是 OP 所期望的(我不熟悉 GNU get_pc()
内在函数)。【参考方案2】:
你确定这些是函数吗?我对 ARM 不是很熟悉,但对我来说这些听起来像是编译器内在函数。如果您要迁移到 GCC,最好用内联汇编替换它们。
【讨论】:
或找到匹配的intrinsic/builtinget_pc
函数返回程序计数器变量中的值。 get_cpsr(ARM CPSR 寄存器)和 get_sp(堆栈指针)也是如此。
但那些是寄存器,不是变量。您不能直接从 C 函数访问寄存器,您需要内联汇编或编译器为您提供一些内置的内在函数(有时会在编译器特定的头文件中声明,有时根本没有)。我没有看到任何证据表明 GCC 提供了您需要的内置插件(有一些与 ARM 相关的插件,但没有您想要的等效插件),所以我认为您需要一些内联 ASM。
以上是关于GNU ARM 中 get_pc() 的声明在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
gnu 和 gnu-arm 编译器可以在同一个系统上共存吗?
我在哪里可以找到 arm-linux-gnueabihf-ld 的联机帮助页,更不用说包含 -rpath 和 -rpath-link 的编写良好的联机帮助页了?