How to make local labels in GNU GAS ELF output that GDB can break on but not count as functions?

独自空忆成欢 提交于 2019-12-02 03:47:47

问题


When writing assembly manually with GNU GAS, within a function, I want to set a label such that:

  • GDB won't treat that label as the function name
  • I can use b mylabel to break on the label

A similar question for nasm has been asked at: Break at local label using GDB for NASM assembly but I wanted to make it more precise here that I want GNU GAS and ELF output.

E.g. if I defined a normal label mylabel as in:

main.S

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

that does not satisfy me because when GDB reaches the mov $0, %rdi, bt shows mylabel as the function name, and I would like it to be _start instead. In particular, this can break backtraces because GDB can't find the stack frame: How gdb reconstructs stacktrace for C++?

However, if I replace mylabel with .Lmylabel as explained at: Local labels in GNU assembler; gdb printing backtrace as though labels are functions then _start is the function name as desired, but b .Lmylabel fails. nm does not show the symbol at all either.

Does the ELF / DWARF formats support anything that could be used, and is there any way to expose that though GNU GAS?

Tested in Ubuntu 18.10, GDB 8.2, GNU GAS 2.31.1.


回答1:


I'm not sure if this fits your needs, but you can do this (for a non-PIE binary, so link with -no-pie):

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

Then, you can set a breakpoint using break *mylabel (note the *):

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

Since mylabel is more or less a function pointer, GDB does not know anything about it and will ignore it:

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

With a linker script, it should be possible to put the mylabel symbol into a section which is not loaded, to reduce run-time overhead.



来源:https://stackoverflow.com/questions/55226798/how-to-make-local-labels-in-gnu-gas-elf-output-that-gdb-can-break-on-but-not-cou

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!