В целях достижения школьного проекта я должен перекодировать функции malloc и free, используя только mmap и munmap.Я также должен скомпилировать эти функции в динамическую библиотеку (.so файл) и использовать ее во время выполнения.
Я работаю под Mac OS Sierra 10.12.6.
Вот моя проблемаКогда я запускаю свою очень простую программу без вызова malloc, но с использованием динамической библиотеки, я могу заметить, что некоторые вызовы malloc вызывают нежелательные страницы.Тестовая программа, о которой я говорю:
int main()
{
int i;
char *addr;
addr = 0;
i = 0;
while (i < 1024) {
i++;
}
return (0);
}
Я пытаюсь научиться использовать инструменты отладки, такие как strace, но сейчас я могу заметить вызов malloc, просто используя printf внутри моих собственных источников.Действительно, когда я запускаю тест, вызывается printf, а malloc не используется.Вот команды, которые я использую для компиляции и запуска всего:
gcc -shared srcs... -o lib_malloc.so
gcc test.c -o test -L ./ -lmalloc
./run.sh ./test
(исходные файлы уже скомпилированы как объектные файлы с флагами -Wall -Wextra -Werror перед компоновкой в первой строке)
Вот файл run.sh:
#!/bin/sh
export DYLD_LIBRARY_PATH=.
export DYLD_INSERT_LIBRARIES="lib_malloc.so"
export DYLD_FORCE_FLAT_NAMESPACE=1
$@
Я также написал простую функцию печати из памяти.Его цель - напечатать каждый выделенный блок моим собственным malloc, вызывая мои связанные списки и печатая его ... Если я добавлю его в конец моего кода test.c, я смогу увидеть некоторые блоки, например:
TINY : 0x106f65000
0x106f65052 - 0x106f65072 : 4 octets
0x106f6509c - 0x106f650bc : 4 octets
0x106f650e6 - 0x106f65106 : 4 octets
0x106f65130 - 0x106f6513f : 1 octets
0x106f65169 - 0x106f65196 : 5 octets
0x106f651c0 - 0x106f651fa : 7 octets
0x106f65224 - 0x106f65251 : 5 octets
0x106f6527b - 0x106f652ad : 6 octets
0x106f652d7 - 0x106f65306 : 5 octets
0x106f65330 - 0x106f6533e : 1 octets
0x106f65368 - 0x106f653a8 : 8 octets
0x106f653d2 - 0x106f65403 : 6 octets
0x106f6542d - 0x106f65470 : 8 octets
0x106f6549a - 0x106f654ce : 6 octets
0x106f654f8 - 0x106f6552e : 6 octets
0x106f65558 - 0x106f65564 : 1 octets
0x106f6558e - 0x106f655bb : 5 octets
0x106f655e5 - 0x106f6564b : 12 octets
0x106f65675 - 0x106f65685 : 2 octets
0x106f656af - 0x106f656ef : 8 octets
0x106f65719 - 0x106f65727 : 1 octets
0x106f65751 - 0x106f65851 : 32 octets
Мы можем заметить, что в любом случае были выделены только "крошечные" нежелательные пространства ... Я мог где-то сделать глупую ошибку или что-то неправильно понять, если кто-то поймет, что происходит, это спасет меня так сильно!Я ищу решение с тех пор, весь мой исходный код для этих функций закончен.Я могу поделиться больше кода, если это необходимо.Помогите, пожалуйста !
Я прошу прощения за мой английский, в настоящее время я занимаюсь, спасибо :)