我想创建一个全局或静态函数,但要确保函数地址最多占用 24 位。有没有办法做到这一点?
编辑:我正在为 arm 架构使用 arm-linux-gnueabi-gcc 交叉编译器。主程序在arm模式下静态链接和翻译。我真正想要的是重新定位 printf 符号,但是 &printf 需要 4B,所以指令 BL &printf 不会做。所以,我最多可以有3B。
我想创建一个全局或静态函数,但要确保函数地址最多占用 24 位。有没有办法做到这一点?
编辑:我正在为 arm 架构使用 arm-linux-gnueabi-gcc 交叉编译器。主程序在arm模式下静态链接和翻译。我真正想要的是重新定位 printf 符号,但是 &printf 需要 4B,所以指令 BL &printf 不会做。所以,我最多可以有3B。
在标准 C 中没有办法做到这一点。您必须使用特定于您的开发人员工具和目标平台的功能。你没有说明这些是什么,所以我们不能给你具体的建议。
大多数体系结构都提供与当前指令有偏移的分支,在这种情况下,您的要求是目标函数在调用附近,而不是在地址空间的前 2 24个字节内。你确定你有一个分支指令,它分支到一个绝对地址并且包含一个 24 位立即数?
汇编器和链接器可能具有设置程序段位置的方法,并且您可以将目标函数放入特定段,然后设置该段的地址。这样做不当可能会违反目标操作系统中的规则,因此您需要了解目标系统中可执行程序的布局。
通常,链接器的默认行为将为您的代码提供合适的地址,除非您的程序很大。如果目标地址对于指令的立即数字段来说太大,则链接器应该产生错误。这意味着至少不会有程序执行不正确的危险,因为在构建完成之前会检测到错误。
您可以考虑替代方案,例如构建完整地址(以便它可以处理任何大小的地址)并分支到完整地址的多个指令序列。通常有一些指令可以帮助完成此操作,例如加载值的高位部分、添加低位部分以及跳转到存储在寄存器中的地址的指令。
我想,是的,您至少可以在嵌入式 C 编程中手动设置函数地址。为此,您必须编辑链接器文件,您可以在其中指定对象(或函数)的地址。使用名为“#pragma”的编译器指令在代码中使用此地址。
您只想将函数加载到可能的最低地址。为什么不在文件顶部定义函数并将其编译成“.o”文件。将此文件作为第一个文件提供给加载程序。使您的 main() 变得简单而小巧。
这只是我的猜测。这可能会将您的函数置于尽可能低的地址。