Как сделать локальные метки в выводе GNU GAS ELF, которые GDB может разбить, но не считать как функции? - PullRequest
2 голосов

При написании сборки вручную с помощью GNU GAS внутри функции я хочу установить метку так, чтобы:

  • GDB не будет обрабатывать эту метку как имя функции
  • Я могу использовать b mylabel, чтобы разбить на этикетке

Аналогичный вопрос для nasm был задан по адресу: Разрыв локальной метки с использованием GDB для сборки NASM , но я хотел бы уточнить, что я хочу вывод GNU GAS и ELF.

например. если я определил нормальную метку mylabel как в:

main.S

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

, что меня не устраивает, потому что когда GDB достигает mov $0, %rdi, bt показывает mylabel в качестве имени функции, и я бы хотел, чтобы оно было _start вместо этого. В частности, это может нарушить обратные трассировки, поскольку GDB не может найти кадр стека: Как GDB восстанавливает трассировку стека для C ++?

Однако, если я заменю mylabel на .Lmylabel, как объяснено в: Локальные метки в ассемблере GNU; GDB выводит отпечаток, как если бы метки были функциями , тогда _start - это имя функции по желанию, но b .Lmylabel завершается ошибкой. nm также не показывает символ вообще.

Поддерживает ли форматы ELF / DWARF что-либо, что можно было бы использовать, и есть ли способ показать это через GNU GAS?

Протестировано в Ubuntu 18.10, GDB 8.2, GNU GAS 2.31.1.

1 Ответ

2 голосов
/ 19 марта 2019

Я не уверен, что это соответствует вашим потребностям, но вы можете сделать это (для двоичного файла без 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 в раздел, который не загружен, чтобы уменьшить накладные расходы времени выполнения.

...