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