За год работы с menuetlibc и newlib я стал более опытен и научился работать с map-файлами.
И вот сегодня я осознал, что основная часть программ (которую мне удалось собрать для Колибри, но которая всё же падает при запуске) падает при обращении либо к init_brk, либо sbrk. Что вообще эти функции должны делать и почему при обращении к ним программа может упасть? По идее, эти функции должны управлять памятью, верно? В каких случаях тогда может наблюдаться эпик фейл?
Если разобраться с этими багами, вероятно, в Колибри заработают еще пару эмуляторов и языков программирования. Да и вообще, лучше без багов, чем с ними
Судя по коду, init_brk инициализирует кучу, sbrk выделяет очередной блок динамической памяти из кучи. На них основаны malloc/realloc/free, которые из этого блока нарезают уже маленькие области. Почему падает, вопрос к телепатам. Может, памяти не хватает?
В menuetlibc, лежащей на svn, могут быть проблемы, если приложение многопоточное и много потоков пытаются выделять/освобождать память параллельно. Для исправления достаточно вставить вызовы malloc_lock() в начало malloc() и free(), src/libc/ansi/stdlib/malloc.c, и malloc_unlock() перед каждым return и в конце free().
joker@joker-VirtualBox:~$ cd menuetlibc
joker@joker-VirtualBox:~/menuetlibc$ make
Building library for linux
gcc mkversion.c -o mkversion
./mkversion < version > include/libc/version.h
make -C linuxtools
make[1]: Вход в каталог `/home/joker/menuetlibc/linuxtools'
Makefile:1: /osrules.mak: Нет такого файла или каталога
make[1]: *** Нет правила для сборки цели `/osrules.mak'. Останов.
make[1]: Выход из каталога `/home/joker/menuetlibc/linuxtools'
make: *** [all] Ошибка 2
joker@joker-VirtualBox:~/menuetlibc$