代码之家  ›  专栏  ›  技术社区  ›  Ciro Santilli OurBigBook.com

如何在GNU GAS ELF输出中生成本地标签,GDB可以破坏这些标签,但不能算作函数?

  •  0
  • Ciro Santilli OurBigBook.com  · 技术社区  · 6 年前

    使用GNU GAS在函数中手动编写程序集时,我希望设置一个标签,以便:

    • 我可以用 b mylabel 打破标签

    一个类似的问题 nasm 被问及: Break at local label using GDB for NASM assembly 但我想更精确地说,我想要GNU气体和ELF输出。

    例如,如果我定义了一个普通标签 mylabel 例如:

    梅因

    .text
    .global _start
    _start:
        /* exit */
        mov $60, %rax
    mylabel:
        mov $0, %rdi
        syscall
    

    mov $0, %rdi , bt 显示 迈拉贝尔 _start 相反。特别是,这可能会中断回溯,因为GDB找不到堆栈帧: How gdb reconstructs stacktrace for C++?

    但是,如果我替换 迈拉贝尔 .Lmylabel Local labels in GNU assembler; gdb printing backtrace as though labels are functions 然后 是所需的函数名,但是 b .Lmylabel 失败。 nm 也不显示符号。

    在ubuntu18.10,gdb8.2,gnugas2.31.1中测试。

    0 回复  |  直到 6 年前
        1
  •  3
  •   Florian Weimer    6 年前

    我不确定这是否符合您的需要,但您可以这样做(对于非饼图二进制文件,请链接 -no-pie ):

    .text
    .global _start
    _start:
        /* exit */
        mov $60, %rax
    .Lmylabel:
        mov $0, %rdi
        syscall
        .section .rodata
    mylabel:
        .long .Lmylabel
    

    然后,可以使用 break *mylabel * ):

    (gdb) break *mylabel
    Breakpoint 2 at 0x401007: file t.S, line 7.
    
    

    mylabel 或多或少是一个函数指针,GDB对此一无所知,将忽略它:

    Breakpoint 1, _start () at t.S:5
    5       mov $60, %rax
    (gdb) si
    7       mov $0, %rdi
    

    使用链接器脚本,应该可以将 符号放入未加载的部分,以减少运行时开销。

    推荐文章