Gcc 在elf中设置.symtab地址和标志,以使用arm none eabi工具链将其加载到内存中

Gcc 在elf中设置.symtab地址和标志,以使用arm none eabi工具链将其加载到内存中,gcc,ld,cortex-m,linker-scripts,newlib,Gcc,Ld,Cortex M,Linker Scripts,Newlib,我想使用gdb调试器将.symtab加载到内存中 正常区段最多需要两个步骤(对于某些区段,例如.text,.data,…,步骤1可以跳过,因为ld会自动设置): 1-将Alloc标志(如果是特殊节)设置为ELF中的节。这可以通过这种方式为正常部分完成。 arm-none-eabi-objcopy --set-section-flags .sectionName=alloc src.elf dst.elf 2-将地址设置为节。这可以通过两种方式为正常部分AFAIK完成 A-在LD脚本中指定节内存

我想使用gdb调试器将
.symtab
加载到内存中

正常区段最多需要两个步骤(对于某些区段,例如
.text
.data
,…,步骤1可以跳过,因为ld会自动设置):

1-将Alloc标志(如果是特殊节)设置为ELF中的节。这可以通过这种方式为正常部分完成。

arm-none-eabi-objcopy --set-section-flags .sectionName=alloc src.elf dst.elf
2-将地址设置为节。这可以通过两种方式为正常部分AFAIK完成

A-在LD脚本中指定节内存区域,例如,对于文本节:

.text :
{
    *(.text)
    *(.text*)
} > FLASH
B-再次使用对象复制

arm-none-eabi-objcopy --change-section-address .sectioName=0x0ABCD src.elf dst.elf
由于
.symtab
是由链接器自动生成的,因此我无法将其视为正常部分,因此上述步骤均无效

有人知道如何解决这个问题吗?


我已经成功地实施了一个解决方案,生成一个新的elf,剥离所有不需要的部分,这是可行的,但是您必须加载两个elf,我正在寻找一个更干净的解决方案。

您的最终游戏似乎是错的。您有一个arm none编译器,它意味着没有操作系统。您需要一个gdbserver端口在ARM上运行,并在另一台开发PC上使用远程调试;否则,您所做的意味着您正在将GDB移植到某个未知/非金属系统?更多的信息/澄清可能会有帮助。我希望在运行时有可用的符号表来解决其他精灵的符号。您的最终游戏似乎是错误的。您有一个arm none编译器,它意味着没有操作系统。您需要一个gdbserver端口在ARM上运行,并在另一台开发PC上使用远程调试;否则,您所做的意味着您正在将GDB移植到某个未知/非金属系统?更多的信息/澄清会很有帮助。我希望在运行时有可用的符号表来解决其他ELF的符号