c语言 - 在我的 malloc 共享库中找不到我的分段错误



我使用 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

但是当我使用应该用我的 libft_malloc.so 文件替换官方 malloc 库的 run.sh 运行它时,我遇到了一个段错误:

-> 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() 放在任何地方进行调试,但段错误似乎不在 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: 使用标志编译 fsanitize=地址修复段错误,但这绝对不是最佳的

编辑 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 使我中止

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 或免费时出现段错误时,会附加此错误,免费修复使其正常工作。

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

gcc -g -O0 

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

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

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

相关内容

  • 没有找到相关文章

最新更新