9

我需要一个在 STM32F401 上工作的位置无关代码 (PIC)。但是我对指向在结构中使用的函数的指针有问题。

简短的例子:

struct process {
  struct process *next;
  const char *name;
  PT_THREAD((* thread)(struct pt *, process_event_t, process_data_t));
  struct pt pt;
  unsigned char state, needspoll;
};

process etimer_process...

static void call_process(struct process *p, process_event_t ev, process_data_t data) {
  int ret;
  ret = p->thread(&p->pt, ev, data);
}

拆卸后:

Disassembly of section .data:
   ...
 20000768 <etimer_process>:
 20000768:  00000000    andeq   r0, r0, r0
 2000076c:  0803b134    stmdaeq r3, {r2, r4, r5, r8, ip, sp, pc}
 20000770:  08027435    stmdaeq r2, {r0, r2, r4, r5, sl, ip, sp, lr}
 20000774:  00000000    andeq   r0, r0, r0
   ...

Disassembly of section .text:
   ...
 8027da4:   68fb        ldr r3, [r7, #12]  //R3 = 0x20000768
 8027da6:   689b        ldr r3, [r3, #8]   //R3 = 0x8027435
   ...
 8027db2:   4798        blx r3  //Branch to R3
   ...

R3 中的分支地址对于偏移量不同于 0 的代码是错误的。我在这里看不到 GOT 的使用。这是一个错误还是缺少编译器/链接器选项?


我可能已经成功解决的事情:

  • 得到修复
  • 中断表修复
  • 使用适当的 cflags 编译的 Newlib

使用过的 CFLAGS:

-mlittle-endian -mthumb -mthumb-interwork -mcpu=cortex-m4 -fsingle-precision-constant -Wdouble-promotion -msoft-float -fpic -msingle-pic-base -mpic-data-is-text-relative -mpic -register=r10 -Wno-strict-aliasing -lc

并与

-fpic

4

1 回答 1

-1

在这种情况下不需要使用 GOT。相反,编译器将添加一个运行时重定位,它将指示动态链接器etimer_process.thread在启动时修补(我假设它在定义时初始化etimer_process)。

于 2021-12-28T09:36:26.110 回答