Не могу найти ошибку сегментации в моей общей библиотеке malloc - PullRequest
0 голосов
/ 15 мая 2018

Я перекодировал 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 заставил меня прервать

Ответы [ 2 ]

0 голосов
/ 18 мая 2018
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'

Эта ошибка дополняется, когда в вашем malloc или в бесплатной версии есть ошибка, восстановление бесплатно заставило ее работать.

0 голосов
/ 15 мая 2018

Вы можете отладить его в GDB.Сначала соберите свой код с параметрами отладки:

gcc -g -O0 

Указанные выше параметры должны использоваться как для вашей библиотеки lib, так и для тестовой программы.Затем вы можете попробовать запустить вашу программу в gdb:

gdb a.out
(gdb) r <arguments to a.out>
(gdb) bt     <-- when it crashes

Linux загружает вашу программу в память и вызывает точку входа main.Код запуска, который компилятор добавляет для платформы, может вызывать malloc.Следовательно, сбой без malloc в вашем тестовом коде.

...