问题标签 [eabi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
149 浏览

assembly - 汇编中的 .size 运算符( stm32 )

我的问题是关于 .size 运算符在 ARM CORTEX M 启动文件中的使用,例如这个启动脚本

我已经阅读了有关 .size 运算符的其他问题,我的理解是以下行:

.size X,.-X

允许通过当前位置 (.) 与符号 X 的定义之间的距离来定义 X 的大小。

当在 X 定义的末尾使用此行时,这是可以的。没问题。但是在符号之前使用它如何工作?

在启动脚本的第 94 行,您可以阅读:

它不应该定义-1的大小吗????它怎么能工作?我想这不是错误,因为您可以在所有 STM32 启动代码中找到它^^

谢谢,

0 投票
1 回答
77 浏览

assembly - 为什么在许多 arm64 程序的程序结束之前有 ab (branch) 指令?

这是来自 linux 源代码 arch/arm64/kernel/head.S 显示内核启动。代码首先调用preserve_boot_args,然后el2_setup使用bl(分支和链接)调用。我也展示了程序preserve_boot_args

据我了解,bl是用于调用过程(在过程之后,返回到保存在 lr - 链接寄存器,x30 中的地址)并且b只是去标记的地址而不返回。但在上面的程序中preserve_boot_args,就在最后,有一条b __inval_dcache_area指令直接去__inval_dcache_area而不返回。那么它如何返回到原始代码(在哪里bl el2_setup)?一个程序如何结束自己?SYM_CODE_END 的定义是这样的:

我不明白这段代码如何使它返回到lr. 我们不应该做类似的事情mv pc, lr吗?

0 投票
2 回答
849 浏览

c - arm链接器在函数调用中使用的“单板”是什么?

我刚刚阅读了https://www.keil.com/support/man/docs/armlink/armlink_pge1406301797482.htm。但无法理解 arm 链接器在函数调用之间插入的单板是什么。

在“ARM 体系结构的过程调用标准”文档中,它说,

5.3.1.1 链接器对 IP 的使用 ARM 和 Thumb 状态的 BL 指令都无法寻址完整的 32 位地址空间,因此链接器可能需要在调用例程和被调用例程之间插入胶合代码子程序。可能还需要单板来支持 ARM-Thumb 互通或动态链接。插入的任何单板都必须保留除 IP (r12) 和条件代码标志之外的所有寄存器的内容;符合要求的程序必须假定可以在任何暴露于支持互通或长分支的重定位的分支指令中插入更改 IP 的胶合代码。注意 R_ARM_CALL、R_ARM_JUMP24、R_ARM_PC24、R_ARM_THM_CALL、R_ARM_THM_JUMP24 和 R_ARM_THM_JUMP19 是具有此属性的 ELF 重定位类型的示例。详情请参阅 [AAELF]

这是我的猜测,是这样的吗?:当函数 A 调用函数 B 时,当这两个函数相距太远而无法用bl命令表达时,链接器会在函数 A 和 B 之间插入函数 C,使函数 C 接近函数 B。现在函数 A 使用b指令转到函数 C(在函数调用之间复制所有寄存器),函数 C 使用bl指令(也复制所有寄存器)。当然r12寄存器是用来保存剩余的长跳转地址位的。这就是贴面的意思吗?(我不知道为什么 arm 不解释单板是什么,而只解释单板提供什么..)

0 投票
1 回答
194 浏览

gcc - 使用 arm-none-eabi 交叉编译识别编译器版本

我正在尝试找出我的项目中使用的编译器版本(以便在团队中同步它们)。

我在 STM32 上使用 ChibiOS,它使用 makefile 进行编译。在它使用的 Makefile

这清楚地表明正在使用 arm-none-eabi-gcc。但我不清楚的是,我的 gcc 编译器 (gcc --version) 的版本是否与编译完全相关。据我了解,gcc 只是在这里设置为特定目标?我的 gcc/cc 可执行文件和 arm-none-eabi-gcc 可执行文件之间有什么关系?

0 投票
0 回答
75 浏览

c++ - Valgrind 在 32 位树莓派上显示 64 位

我正在交叉编译一个 C / C++ 应用程序,以便在运行在 VM 中的 x64 Debian Linux 系统上使用来自 Tools Github 存储库的 arm-rpi-4.9.3-linux-gnueabihf 编译器在 Raspberry Pi 4 上运行。我在使用这个应用程序时遇到了一些问题,所以我使用 GCC 8.3.0-++rpi1 在 Raspberry Pi 上从源代码构建了 Valgrind。

我使用的编译器二进制文件可以在这里下载:https ://github.com/raspberrypi/tools/tree/master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf

如果我在 RPI 上运行 Valgrind,我会收到许多错误,其中许多表示“无效读取大小为 8”。我的理解是这在 64 位架构 (8*8 = 64) 上很典型,但在这个 32 位系统上可能会产生误导,除非应用程序正在访问 64 位数据结构。此外,在为 x64 系统构建和运行的同一个应用程序上运行 Valgrind 不会识别这些相同位置的错误,这让我认为编译工具链引入了 ABI 问题,或者 Valgrind 给出了误导性的错误指示 - - 或两者。

Valgrind 还在启动时指示:

--3451-- Arch 和 hwcaps:ARM、LittleEndian、ARMv8-neon-vfp --3451-- 页面大小:当前 4096,最大支持 4096

但是 $ uname -m 表示:arm7l,我理解它是 32 位的(绝对不是 ARMv8)。

任何人都可以就这里可能出现的问题提供任何指导吗?

谢谢!