如何在 C 中的特定地址放置函数
How to place a function at a particular address in C?
我想在特定位置放置一个函数void loadableSW (void)
:0x3FF802
.在另一个函数residentMain()
中,我将使用指向函数的指针跳转到此位置。如何声明函数 loadableSW
实现这一目标。为了清楚起见,我附上了residentMain
的骨架。
更新:目标硬件是 TMS320C620xDSP。由于这是一个航空航天项目,因此确定性行为是一个理想的设计目标。理想情况下,他们想知道内存的哪一部分在特定时间包含什么。我刚刚知道的解决方案是在链接器文件中定义内存中的部分。该部分应从0x3FF802
(放置函数的位置)开始。由于loadableSW
函数的大小是已知的,因此也可以确定内存部分的大小。然后指令#pragma CODESECTION ("function_name", "section_name")
可以将该函数放在指定的部分中。
由于测试脚本中不允许使用pragma
指令,我想知道是否有任何其他方法可以在不使用任何链接器指令的情况下执行此操作。
此外,我很好奇。C++ 中是否有函数的放置语法?我知道有一个对象,但是函数呢?
void residentMain (void)
{
void (*loadable_p) (void) = (void (*) (void)) 0x3FF802;
int hardwareOK = 0;
/*Code to check hardware integrity. hardwareOK = 1 if success*/
if (hardwareOK)
{
loadable_p (); /*Jump to Loadable Software*/
}
else
{
dspHalt ();
}
}
我不确定您的操作系统/工具链/IDE,但以下答案应该有效:
如何指定存储函数的内存位置?
我知道只有一种方法,它显示在第一个答案中。
更新
如何在 gcc 中定义部分:
变量:http://mcuoneclipse.com/2012/11/01/defining-variables-at-absolute-addresses-with-gcc/
方法(部分("部分名称")):http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html#Function%20Attributes
如何在 C 中的特定地址放置函数?
由于杂注指令在测试脚本中是不允许的,我想知道是否有任何其他方法可以在不使用任何链接器指令的情况下做到这一点。
如果目标支持 PC 相对寻址,并且可以确保它是纯的,则可以使用memcpy()
来重新定位例程。
如何从内存运行代码...对此有一些提示。 如果您无法生成与PC相关的/可重定位的代码,那么如果没有链接器的帮助,则绝对无法做到这一点。 这是链接器/加载器的定义,用于修复地址。
这可以带你到一个不同的概念。 不要完全链接您的代码。 而是将地址修复推迟到加载。 然后,您必须编写一个加载器以在运行时放置代码;但从您的航空航天项目评论来看,我认为复杂性和分析也很重要,所以我不相信您会接受这一点。 您还需要双倍的存储空间等。
- 如何在c++程序中找到函数的地址
- 函数名是c中该函数的第一条指令的地址吗
- 从 C++ 中的函数返回数组地址问题
- 为什么成员函数地址离自由函数这么远?
- 调用 lua 函数的地址为 C/C++?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 为什么每次执行时函数的地址都不同?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 获取函数的地址?
- 模板到函数的时刻地址是否可以作为指向某个函数的函数指针传递?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 指针在函数调用后更改其地址
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 在每个运行时将函数保存到相同的地址
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 如何定义全局函数指针并分配给特定地址
- 常量引用函数参数的地址何时唯一?
- 打印我的Get MAC地址函数的std::字符串时出现意外输出
- 成员函数地址(函数指针)