【问题标题】:Missing debug information from NASM and GCC缺少来自 NASM 和 GCC 的调试信息
【发布时间】:2017-01-05 16:24:30
【问题描述】:

我正在构建一个小型操作系统可执行文件,但我在使用 NASM、GCC 和 GNU Binutils 的链接过程中遇到问题。
我正在链接多种类型的目标文件:

  • 带有来自 NASM 的 dwarf 调试信息的 ELF32 目标文件
  • 带有来自 GCC 的 dwarf 调试信息的 ELF32 目标文件

当我使用自定义链接描述文件链接这些文件,然后重新读取 degub 信息时,我只能从第一个链接的目标文件中找到调试信息(按有效地址排序)。

出于参考目的,我将发布几行用于编译的代码:

nasm -g -felf32 -F dwarf entry.asm -o "build/entry.o"  
gcc -c main.c -o "build/main.o" -m32 -mtune=i386 -gdwarf

还有链接:

ld -Tlinker.ld -m elf_i386 --nmagic -nostdlib -static -o "build/bootload.elf" -M -g > "build/map.txt"

我使用 GCC v. 6.2、Binutils v. 2.27 和 NASM v. 2.12
如果需要,我会发布一些链接描述文件。请帮忙,没有线路信息的调试很烦人。

【问题讨论】:

  • 您是否尝试过不使用链接器脚本来查看是否是这个原因?
  • 我需要链接器脚本,因为我需要将某些代码放在特定的地址。
  • 我明白,尽管如此,了解这是否会导致问题会有所帮助。
  • 好的,我会在回到 PC 时尝试,即使我不知道我是否能够在没有所述脚本的情况下进行链接
  • 只需创建一个minimal reproducible example,不必是您的真实代码。

标签: gcc assembly linker nasm ld


【解决方案1】:

已修复。
正如@Jester(谢谢)所建议的那样,问题出在链接描述文件中。
我将每个目标文件部分放在最终 ELF 文件的 .text 部分中。我将发布一些代码来解释新旧更正的行为:

旧:

.text : AT(0x800) {
    test.o(*);
}

新:

.text : AT(0x800) {
    test.o(.text);
    test.o(.data);
    test.o(.bss);
}

所有这些代码都用于链接描述文件。

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2020-06-23
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多