отладочная информация для gdb (ARM)

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

отладочная информация для gdb (ARM)

Сообщение БудДен » 01.11.22 10:58

Надо было начать с интела, но ладно.

Код: Выделить всё

# https://stackoverflow.com/questions/19419782/exit-c-text0x18-undefined-reference-to-exit-when-using-arm-none-eabi-gcc
arm-none-eabi-gcc dummy.c --specs=nosys.specs


Вернёмся к интелу

Код: Выделить всё

gcc -g -c dummy.c
ld dummy.o --defsym something=0x100500
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
den73@deb8:~/gddb$ gdb a.out
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
Reading symbols from a.out...done.
(gdb) info symbol something
Cannot access memory at address 0x100500
(gdb) ^d
Делим a.out на отладочную инфу и остальное, оно работает:

Код: Выделить всё

den73@deb8:~/gddb$ objcopy a.out --only-keep-debug a.debug
den73@deb8:~/gddb$ strip a.out
den73@deb8:~/gddb$ gdb a.out
Reading symbols from a.out...(no debugging symbols found)...done.
(gdb) symbol-file a.debug
Reading symbols from a.debug...done.
(gdb) info symbol something
Cannot access memory at address 0x100500

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: отладочная информация для gdb (ARM)

Сообщение БудДен » 01.11.22 12:32

И теперь то же самое для arm (dummy.c - это hello,world на Си).

Код: Выделить всё

arm-none-eabi-ld dummy.c -g -c --specs=nosys.specs -o dummy.o
arm-none-eabi-ld dummy.o --defsym v2=0x8020
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000
arm-none-eabi-objcopy a.out --only-keep-debug a.debug
# запукаем в другом окне QEMU с ядром ЯОС с -s -S
arm-none-eabi-gdb -tui --command=~/commands.gdb 
(gdb) symbol-file a.debug
(gdb) x &v2
0x8020:       0x0001b000
Но в распечатке ассемблера это имя не попадается. На этом на сегодня хватит.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: отладочная информация для gdb (ARM)

Сообщение БудДен » 02.11.22 14:04

Код: Выделить всё

git clone https://github.com/TinyCC/tinycc
cd tinycc
./configure
make
make test
cd ..
echo '#include <stdio.h>
int main() {
 printf("Hi!\n");
}' > a.c
tinycc/tcc -Btinycc a.c -o a.o
./a.o
tcc_debug_start, put_stabs, tcc_debug_end, tcc_debug_funcstart, tcc_debug_*line

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: отладочная информация для gdb (ARM)

Сообщение БудДен » 02.11.22 19:58

Частичный успех - удалось увидеть в отладчике ядра отладочную инфу, которую сгенерил tcc для левой программы. Осталось подсунуть свою инфу вместо той, которая выдаётся.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: отладочная информация для gdb (ARM)

Сообщение БудДен » 03.11.22 00:25

global_identifier_push - кладёт глоб. идентификатор. Есть ещё хеш-таблица, в неё запись происходит в tok_alloc.

Будем повторять структуру вызова decl из верхнего уровня компиляции, дублируя дерево. Вот, наконец методику придумал.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: отладочная информация для gdb (ARM)

Сообщение БудДен » 07.11.22 00:28

Похоже, что модуль содержит единую секцию кода, а отдельные функции - лишь точки в ней. Значит, границы функций внутри модуля нужно определять вычитанием - где началась следующая процедура, там и закончилась предыдущая.

Ответить