5

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.

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985

1 Answers1

3

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.

Florian Weimer
  • 32,022
  • 3
  • 48
  • 92