提问人:Virgil G. 提问时间:11/17/2023 最后编辑:Virgil G. 更新时间:11/17/2023 访问量:84
如何在 C 语言中编译我的 Malloc 版本?
How to compile my version of Malloc in C?
问:
我目前正在对函数的实现进行编码,因此我正在使用以下标志进行编译: .malloc()
-m64 -fPIC -pedantic -Wall -Wextra -Werror -nostdlib -ggdb3
目前,我编译为可执行文件,而不是共享库。
对于我的实现,我正在使用头文件 ,目前我需要 syscall 。问题是在编译时我收到以下错误:.stddef.h
stdint.h
unistd.h
sbrk()
undefined reference to sbrk
我假设如果我使用编译,更普遍地会被禁用,但是我如何在没有 glibc 但使用系统调用的情况下进行编译?sbrk()
unistd.h
-nostdlib
提前致谢
P.S 我真的需要用我不能用,不要鼓励我这样做。sbrk()
mmap()
答:
在这种情况下,请勿使用 . 有专门的更换支持-nostdlib
glibc
malloc()
这应该能够工作。不要启动多个线程,否则你会头疼。sbrk()
如果找不到,请改为拨打。 已过时,并且不能很好地与现代系统设施交互。sbrk()
mmap()
sbrk()
评论
sbrk()
已经过时,不能很好地与现代系统设施交互。 由 glibc 自己的实现使用。如果 OP 正在替换整个实现,则工作正常。sbrk()
malloc()
malloc()
sbrk()
如果你正在做听起来像你正在尝试做的事情,那么你最终将不得不编写你自己需要的所有 C 库功能的实现。但是,朝这个方向前进的垫脚石是像这样编译您的半独立程序:
gcc -c -ffreestanding [other options] -o foo.o foo.c
# ... repeat the above for all other object files ...
gcc -ffreestanding -nostdlib -nostartfiles -static -o yourprogram \
foo.o [other objects] -lc -lgcc
这告诉 C 实现仅提供您自己实际使用的标准库部分。请注意,许多标准 API 在此模式下无法正常工作;不要使用任何来自 ,也不要使用任何与语言环境相关的内容(因为 C 标准使用该术语),也不要使用任何与线程相关的内容。不过,系统调用包装器应该没问题,大多数 .stdio.h
string.h
评论
sbrk()
sbrk
不是系统调用;实际的系统调用是,正确调用它需要一些技巧。请参阅 sourceware.org/git/?p=glibc.git;a=blob;f=misc/sbrk.c 了解如何完成。brk
syscall
sbrk()
-nostdlib
extern void *__curbrk;
__
extern void *__curbrk;
__curbrk
void *
评论
long long
long double
complex long double
uintmax_t
long long
max_align_t
max_align_t