【问题标题】:GCC-ARM: Make a jump in C to a linker section instead to a absolute addressGCC-ARM:在 C 中跳转到链接器部分而不是绝对地址
【发布时间】:2019-09-24 11:34:46
【问题描述】:

我有一个软件,它分为两个二进制文件(加载到不同的内存中)。

因此我有两个链接器文件。

一个二进制文件运行并将第二个二进制文件加载到另一个内存中,第二个二进制文件运行。

两个代码都使用了一个函数,它由第一个代码加载到 RAM 中,所以在第二个代码中我调用这个函数实际上是跳转到它在 RAM 中加载的地址(在链接器中第一个 SW 的文件我已经定义了一个特定的部分,我强制加载这个函数)。

目前,这种机制对我来说是正确的。

我的问题是,是否可以跳转到标签或符号而不是特定地址?

理想情况下,在我的链接器文件中,我会使用标签来定义地址,而在代码中我会引用该标签。

也就是说,编译器和链接器都会理解该标记并将其转换为地址。

因此,如果我更改链接器中的地址,我也不必更改 JUMP 指令。

非常感谢

注意:gcc-arm-none-eabi-4_9-2015q3

【问题讨论】:

  • 创建一个链接器文件,在其中导出与您要使用的地址相同的符号?通过一些类型转换,您可以将该值转换为指向您可以调用的函数的指针。
  • @PVA,你基本上是说你想推出你自己的动态链接器?

标签: c linker


【解决方案1】:

Accessing Linker Sections directly from C code

NOLOAD directive

Splitting linker files in two and using both for linking(问题的答案有一个例子)

您可以在 App2 中使用 NOLOAD(在 App1 中正常加载时)了解该功能,但不加载它,然后按照第一个链接中的说明访问它。

如果您想使用预处理器宏和编译/链接选项,您可以拥有一个在两个应用程序之间共享的附加链接器文件,但会根据开关有条件地加载部分。这将帮助您避免在两个链接器文件中重复地址(例如,App1 将使用 ld1 + ldshared 链接,App2 使用 ld1 + ld 与不同的开关共享)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2022-01-03
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多