【发布时间】:2018-09-17 10:52:27
【问题描述】:
我正在编写一个没有标准库的C程序,它由一个elf加载器加载到内存中然后执行。我希望这个 C 程序也能够将其 dwarf 调试部分加载到内存中,以便它可以在运行时打印回溯。
为了实现这一点,我在我的 C 程序中放置了:
extern char __my_old_debug_abbrev_start[];
extern char __my_old_debug_abbrev_end[];
extern char __my_old_debug_info_start[];
extern char __my_old_debug_info_end[];
extern char __my_old_debug_str_start[];
extern char __my_old_debug_str_end[];
所以它可以找出这些部分的位置。然后要实际提供位置,我有一个链接器脚本,如下所示:
SECTIONS
{
.debug_abbrev : {
__my_old_debug_abbrev_start = .;
KEEP (*(.debug_abbrev)) *(.debug_abbrev)
__my_old_debug_abbrev_end = .;
}
.debug_info : {
__my_old_debug_info_start = .;
KEEP (*(.debug_info .gnu.linkonce.wi.*)) *(.debug_info .gnu.linkonce.wi.*)
__my_old_debug_info_end = .;
}
.debug_str : {
__my_old_debug_str_start = .;
KEEP (*(.debug_str)) *(.debug_str)
__my_old_debug_str_end = .;
}
}
INSERT AFTER .rodata;
首先,我将C程序编译成libtest.a,然后使用objcopy将section设置为alloc和load。
objcopy --set-section-flags '.debug_abbrev=alloc,load' libtest.a
objcopy --set-section-flags '.debug_info=alloc,load' libtest.a
objcopy --set-section-flags '.debug_str=alloc,load' libtest.a
objcopy --set-section-flags '.gnu.linkonce.wi.*=alloc,load' libtest.a
然后,我在存档上运行 gcc 以将其编译为可执行文件,如下所示:
gcc libtest.a -o test -T test.lds -static
这会产生错误:
/usr/bin/x86_64-linux-gnu-ld: section .debug_info LMA [0000000000000000,0000000000066291] overlaps section .debug_abbrev LMA [0000000000000000,0000000000007cce]
/usr/bin/x86_64-linux-gnu-ld: section .debug_str LMA [0000000000000000,000000000009d264] overlaps section .debug_info LMA [0000000000000000,0000000000066291]
我不确定如何解决这个问题,因为这些部分仅在链接后才真正存在(?)然后也许我可以使用 objcopy(?) 调整 lma 但我不确定我会将它们放在哪里.
我见过https://stackoverflow.com/a/31126336/3492895,但我不确定如何在链接之前创建“洞”,因此我可以使用objcopy 进行调整。
【问题讨论】:
-
尝试将三个输出部分合并为一个,将其命名为
.debug_all,然后发布结果