gcc 如何在Cortex M3中使用符号文件?

cu6pst1q  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(151)

我正在尝试使用符号文件链接CortexM 3上的程序。“程序”在RAM中运行,并使用来自ROM的静态绑定函数。所以我使用一个符号文件来标识所有ROM函数的地址。
问题是gcc似乎认为符号文件中的所有函数都是ARM 32而不是Thumb,所以我最终使用了thumb-> arm 32转换(当然,由于M3不支持ARM 32指令,这会崩溃)
试验c:

  1. extern void tfunc();
  2. int main()
  3. {
  4. tfunc();
  5. return 0;
  6. }

字符串
符号文件:

  1. tfunc = 0x08011029;


编译:

  1. arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -c test.c
  2. arm-none-eabi-ld test.o --just-symbols=symbolfile


生成如下代码:

  1. arm-none-eabi-objdump -d a.out
  2. a.out: file format elf32-littlearm
  3. Disassembly of section .text:
  4. 00008000 <main>:
  5. 8000: b580 push {r7, lr}
  6. 8002: af00 add r7, sp, #0
  7. 8004: f000 e804 blx 8010 <__tfunc_from_thumb>
  8. 8008: 2300 movs r3, #0
  9. 800a: 4618 mov r0, r3
  10. 800c: bd80 pop {r7, pc}
  11. 800e: bf00 nop
  12. 00008010 <__tfunc_from_thumb>:
  13. 8010: e51ff004 ldr pc, [pc, #-4] ; 8014 <__tfunc_from_thumb+0x4>
  14. 8014: 08011029 .word 0x08011029


请注意,“blx”调用是到偶数地址,而M3规范要求所有跳转都是到奇数(拇指)地址
我在网上找到了一个解决方案,使用汇编器而不是符号文件:符号:

  1. .global tfunc
  2. .type tfunc %function
  3. .equ tfunc, 0x08011029


和建设:

  1. arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -c test.c
  2. arm-none-eabi-as -o sym.o sym.s
  3. arm-none-eabi-ld test.o sym.o


这会生成一个(相当冗长,但至少功能上是正确的):

  1. 00008000 <main>:
  2. 8000: b580 push {r7, lr}
  3. 8002: af00 add r7, sp, #0
  4. 8004: f000 f804 bl 8010 <__tfunc_veneer>
  5. 8008: 2300 movs r3, #0
  6. 800a: 4618 mov r0, r3
  7. 800c: bd80 pop {r7, pc}
  8. 800e: bf00 nop
  9. 00008010 <__tfunc_veneer>:
  10. 8010: b401 push {r0}
  11. 8012: 4802 ldr r0, [pc, #8] ; (801c <__tfunc_veneer+0xc>)
  12. 8014: 4684 mov ip, r0
  13. 8016: bc01 pop {r0}
  14. 8018: 4760 bx ip
  15. 801a: bf00 nop
  16. 801c: 08011029 .word 0x08011029


我发现我可以通过在我的c代码顶部添加'#pragma long_calls'来解决这个问题。
然而,我的问题不是如何让我的代码正确地构建,而是如何在CortexM中使用符号文件,因为有些情况下#pragma不起作用,虽然汇编选项是可行的,但它使构建系统变得更加复杂

k0pti3hp

k0pti3hp1#

注意,“blx”调用是到偶数地址
这些函数由链接器ld生成。
arm-none-eabi-ld test.o --just-symbols=symbolfile
您必须告诉arm-none-eabi-ld您想要生成thumb代码。使用arm-none-eabi-gcc作为链接的前端通常更简单。

相关问题