在我的malloc共享库

时间:2018-05-15 14:38:06

标签: c memory-management segmentation-fault shared-libraries mmap

我使用mmap和munmap在c中重新编写了malloc free和realloc。我将它们编译为共享库.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);
}

这是一个必须用我的共享库替换stdlib的run.sh:

#/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运行它时,应该只用我的libft_malloc.so文件替换官方的malloc库,我得到一个段错误:

-> 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中,所以我迷失了。

编辑: 如果我们在没有任何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  $@

编辑2: 用flag fsanitize = address编译修复段错误,但它绝对不是最佳的

编辑3: 在shell中手动设置2第一个导出告诉我:

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'

在设置第三次导出后,我的所有动作都让我变成了段错误,就像ls和vim一样,cd让我中止

2 个答案:

答案 0 :(得分:0)

您可以在gdb中调试它。首先使用调试选项构建代码:

gcc -g -O0 

以上选项应该用于lib和测试程序。然后你可以尝试在gdb中运行你的程序:

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

Linux加载您在内存中编程并调用入口点main。编译器为平台添加的启动代码可能会调用malloc。因此,测试代码中没有malloc的崩溃。

答案 1 :(得分:0)

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中存在段错误或免费修复此错误,则修复免费使其正常工作。