Я перекодировал malloc free и realloc в c, используя mmap и munmap.Я скомпилировал их как файл .so общей библиотеки.
Вот простой тест:
#include <stdlib.h>
int main() {
int i;
char *addr;
i = 0;
while (i < 1024)
{
addr = (char*)malloc(1024);
addr[0] = 42;
i++;
}
return (0);
}
Вот файл run.sh, который должен заменить stdlib моей общей библиотекой:
#/bin/sh
export DYLD_LIBRARY_PATH=.
export DYLD_INSERT_LIBRARIES="libft_malloc.so"
export DYLD_FORCE_FLAT_NAMESPACE=1
$@
Проблема в том, что когда я компилирую тестовый файл непосредственно с моей общей библиотекой и заменяю в нем заголовок, он работает хорошо:
-> gcc test1.c libft_malloc.so
-> ./a.out
-> no error
Но когда я его запускаюс файлом run.sh, который должен просто заменить официальную библиотеку malloc моим файлом libft_malloc.so, я получаю сообщение об ошибке:
-> gcc test1.c
-> ./run.sh ./a.out
-> ./run.sh: line 5: 73502 Segmentation fault: 11 $@
Я знаю, что ошибка в моем коде, а не в файле run.shили в test.c, потому что это официальные файлы, которые я должен использовать для проверки своей библиотеки в моей школе, и эти файлы хорошо работают в других хранилищах malloc, но я не могу найти, в чем может быть проблема.
Вот мой репозиторий: https://github.com/Shirakawa42/malloc.git
Я попытался отладить, поместив write () везде, но, похоже, segfault не находится в malloc, поэтому я потерян.
edit: Это также segfault, если мы запустим тест без malloc,но просто загрузив мою библиотеку:
#include <stdlib.h>
int main() {
int i;
i = 0;
while (i < 1024)
{
i++;
}
return (0);
}
-> gcc test1.c
-> ./run.sh ./a.out
-> ./run.sh: line 5: 74764 Segmentation fault: 11 $@
edit 2: Компиляция с флагом fsanitize = address исправляет ошибку, но это абсолютно не оптимально
edit 3: Установка первого первого экспорта вручную вshell скажи мне:
dyld: warning: could not load inserted library 'libft_malloc.so' into library validated process because no suitable image found. Did find:
libft_malloc.so: code signing blocked mmap() of 'libft_malloc.so'
и после установки третьего экспорта все мои действия делают меня segfault, как ls и vim, cd заставил меня прервать