【发布时间】:2016-01-08 01:08:53
【问题描述】:
我正在使用 gdb 和 qemu 的 gdb-stub 调试引导加载程序 (syslinux)。在某些时候,主文件会加载一个共享对象ldlinux.elf。
我想在 gdb 中为该文件添加符号。命令add-symbol-file 似乎是要走的路。但是,作为可重定位文件,我必须指定它已加载的内存地址。问题来了。
虽然我知道LOAD 段已加载的基地址,但add-symbol-file 按段工作,并希望我指定每个段已加载的地址。
如果我在内存中指定了文件的基地址,我可以告诉 gdb 加载所有节的所有符号吗?
gdb 的行为有意义吗?节标题不用于运行 ELF,甚至是可选的。我看不到指定部分的加载地址有用的用例。
示例
这里是共享对象的程序头和节头。
Elf 文件类型为 DYN(共享对象文件) 入口点 0x4c60 有 3 个程序头,从偏移量 52 开始 程序标题: 类型 偏移 VirtAddr PhysAddr FileSiz MemSiz Flg Align 加载 0x000000 0x00000000 0x00000000 0x1db10 0x20bfc RWE 0x1000 动态 0x01d618 0x0001d618 0x0001d618 0x00098 0x00098 RW 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x10 段到段映射: 分段部分... 00 .gnu.hash .dynsym .dynstr .rel.dyn .rel.plt .plt .text .rodata .ctors .dtors .data.rel.ro .dynamic .got .got.plt .data .bss 01.动态 02 有 29 个节头,从偏移量 0x78618 开始: 部分标题: [编号] Name Type Addr Off Size ES Flg Lk Inf Al [0]空00000000 000000 000000 00 0 0 0 [1].gnu.hash GNU_HASH 00000094 000094 0007e0 04 A 2 0 4 [2].dynsym 动态 00000874 000874 0015c0 10 A 3 1 4 [3].dynstr STRTAB 00001e34 001e34 0010f4 00 A 0 0 1 [4].rel.dyn REL 00002f28 002f28 000ce8 08 A 2 0 4 [5].rel.plt REL 00003c10 003c10 000568 08 AI 2 6 4 [6] .plt 程序 00004180 004180 000ae0 04 AX 0 0 16 [ 7] .text PROGBITS 00004c60 004c60 013816 00 AX 0 0 4 [8] .rodata PROGBITS 00018480 018480 00462f 00 A 0 0 32 [9].ctors INIT_ARRAY 0001cab0 01cab0 000010 00 WA 0 0 4 [10] .dtors FINI_ARRAY 0001cac0 01cac0 000004 00 WA 0 0 4 [11] .data.rel.ro 程序 0001cae0 01cae0 000b38 00 WA 0 0 32 [12] .动态动态 0001d618 01d618 000098 08 WA 3 0 4 [13] .got PROGBITS 0001d6b0 01d6b0 0000d0 04 WA 0 0 4 [14] .got.plt 程序 0001d780 01d780 0002c0 04 WA 0 0 4 [15] .data PROGBITS 0001da40 01da40 0000d0 00 WA 0 0 32 [16] .bss NOBITS 0001db20 01db10 0030dc 00 WA 0 0 32 [17] .comment PROGBITS 00000000 01db10 000026 01 MS 0 0 1 [18] .debug_aranges 程序 00000000 01db38 0010c0 00 0 0 8 [19] .debug_info 程序 00000000 01ebf8 021ada 00 0 0 1 [20] .debug_abbrev 程序 00000000 0406d2 009647 00 0 0 1 [21] .debug_line 程序 00000000 049d19 00bd3a 00 0 0 1 [22] .debug_frame 程序 00000000 055a54 004574 00 0 0 4 [23] .debug_str 程序 00000000 059fc8 00538c 01 MS 0 0 1 [24] .debug_loc 程序 00000000 05f354 01312d 00 0 0 1 [25] .debug_ranges 程序 00000000 072481 0005d0 00 0 0 1 [26] .shstrtab STRTAB 00000000 072a51 000101 00 0 0 1 [27] .symtab SYMTAB 00000000 072b54 003530 10 28 504 4 [28] .strtab STRTAB 00000000 076084 002593 00 0 0 1 标志的关键: W(写入),A(分配),X(执行),M(合并),S(字符串) I(信息),L(链接顺序),G(组),T(TLS),E(排除),x(未知) O(需要额外的操作系统处理)o(特定于操作系统),p(特定于处理器)如果我尝试在地址 0x7fab000 加载文件,那么它将重新定位符号,以便 .text 部分从 0x7fab000 开始。
然后所有的符号都被 0x4c60 字节关闭。
【问题讨论】:
标签: gdb debug-symbols