gpt4 book ai didi

gdb - 如何在 GNU GAS ELF 输出中制作 GDB 可以破解但不算作函数的本地标签?

转载 作者:行者123 更新时间:2023-12-03 23:52:38 25 4
gpt4 key购买 nike

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

  • GDB 不会将该标签视为函数名称
  • 我可以用 b mylabel打破标签
  • nasm 的类似问题已被询问: Break at local label using GDB for NASM assembly但我想让这里更精确,我想要 GNU GAS 和 ELF 输出。

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

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

    这并不满足我,因为当 GDB 达到 mov $0, %rdi 时, bt显示 mylabel作为函数名,我希望它是 _start反而。特别是,这会中断回溯,因为 GDB 找不到堆栈帧: How gdb reconstructs stacktrace for C++?

    但是,如果我替换 mylabel.Lmylabel如在: Local labels in GNU assembler; gdb printing backtrace as though labels are functions 中解释的那样然后 _start是所需的函数名称,但 b .Lmylabel失败。 nm也根本不显示符号。

    ELF/DWARF 格式是否支持可以使用的任何内容,有没有办法通过 GNU GAS 公开它?

    在 Ubuntu 18.10、GDB 8.2、GNU GAS 2.31.1 中测试。

    最佳答案

    我不确定这是否符合您的需求,但您可以这样做(对于非 PIE 二进制文件,请与 -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

    使用链接描述文件,应该可以放置 mylabel符号放入未加载的部分,以减少运行时开销。

    关于gdb - 如何在 GNU GAS ELF 输出中制作 GDB 可以破解但不算作函数的本地标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55226798/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com