C 让GNU`ld`链接到另一个二进制文件中的静态函数,而不包含它们

C 让GNU`ld`链接到另一个二进制文件中的静态函数,而不包含它们,c,ld,C,Ld,我有一个微控制器,我把一个大程序放在ROM里,在某一点上,它应该把一个有效载荷放到RAM里并执行它,然后再调用ROM里的函数 前半部分(调用RAM)似乎很简单: /* ROM linker script */ MEMORY { rom (rx) : ORIGIN = 0x08000000, LENGTH = 64K /* this includes .text */ ram (rwx) : ORIGIN = 0x20000000, LENGTH = 10K /* was 20K, cu

我有一个微控制器,我把一个大程序放在ROM里,在某一点上,它应该把一个有效载荷放到RAM里并执行它,然后再调用ROM里的函数

前半部分(调用RAM)似乎很简单:

/* ROM linker script */

MEMORY
{
  rom (rx) : ORIGIN = 0x08000000, LENGTH = 64K /* this includes .text */
  ram (rwx) : ORIGIN = 0x20000000, LENGTH = 10K /* was 20K, cut in half to make space for payload, this includes .data, .bss, etc */
  plram (rwx) : ORIGIN = 0x20002800, LENGTH = 10K /* space for payload */
}

SECTIONS{
  .ramPayloadBlock : {
    __RAM_PAYLOAD_START = .;
    KEEP(*(.ramPayload))
  } > plram
}

// ROM code
extern int __RAM_PAYLOAD_START;
void __attribute__((section (".ramPayload"))) (*ramPayload)(void) = (void(*)(void))&__RAM_PAYLOAD_START; // this works as long as the payload's entrypoint is actually at the start of .ramPayload
ramPayload();
但是现在,当实际链接
ramPayload
的代码时,我需要告诉链接器查看ROM的
.map
文件或
.elf
二进制文件或任何我想从RAM调用的ROM函数的地址


在查阅了数小时的
ld
文档后,我真的不知道该怎么做,除了编写一个shell脚本试图解析凌乱的映射文件,并每次生成一个自定义标题,其中充满函数指针,从而重新发明了wheellinker。

好吧,我终于让它开始工作了。 magic linker参数是
-R rom_binary.elf
(它读取符号,但不包含该文件中的任何内容)

并加载
-E
,使其“导出所有动态符号”(即使没有动态链接的内容,当然也没有文档记录)

然后,只需让ram二进制文件的链接器脚本首先定位ram中的所有内容,即您的入口点(这样它就会整齐地放在起始部分,供您从ROM代码中参考)