Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
-
БудДен
- Сообщения: 2873
- Зарегистрирован: 07.10.18 14:01
Сообщение
БудДен » 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
-
БудДен
- Сообщения: 2873
- Зарегистрирован: 07.10.18 14:01
Сообщение
БудДен » 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
Но в распечатке ассемблера это имя не попадается. На этом на сегодня хватит.
-
БудДен
- Сообщения: 2873
- Зарегистрирован: 07.10.18 14:01
Сообщение
БудДен » 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
-
БудДен
- Сообщения: 2873
- Зарегистрирован: 07.10.18 14:01
Сообщение
БудДен » 02.11.22 19:58
Частичный успех - удалось увидеть в отладчике ядра отладочную инфу, которую сгенерил tcc для левой программы. Осталось подсунуть свою инфу вместо той, которая выдаётся.
-
БудДен
- Сообщения: 2873
- Зарегистрирован: 07.10.18 14:01
Сообщение
БудДен » 03.11.22 00:25
global_identifier_push - кладёт глоб. идентификатор. Есть ещё хеш-таблица, в неё запись происходит в tok_alloc.
Будем повторять структуру вызова decl из верхнего уровня компиляции, дублируя дерево. Вот, наконец методику придумал.
-
БудДен
- Сообщения: 2873
- Зарегистрирован: 07.10.18 14:01
Сообщение
БудДен » 07.11.22 00:28
Похоже, что модуль содержит единую секцию кода, а отдельные функции - лишь точки в ней. Значит, границы функций внутри модуля нужно определять вычитанием - где началась следующая процедура, там и закончилась предыдущая.