代码之家  ›  专栏  ›  技术社区  ›  MrZigha

如何用C编译我的Malloc版本?

  •  0
  • MrZigha  · 技术社区  · 1 年前

    我目前正在对的实现进行编码 malloc() 函数,所以我使用以下标志进行编译: -m64 -fPIC -pedantic -Wall -Wextra -Werror -nostdlib -ggdb3

    目前,我将编译为可执行文件,而不是共享库。

    对于我的实现,我使用头文件 stddef.h stdint.h unistd.h ,目前我需要系统调用 sbrk() 。问题是,在编译时,我会得到以下错误: undefined reference to sbrk

    我想 sbrk() 更普遍地说 unistd。h 如果使用编译,则被禁用 -nostdlib 但是 没有怎么编译 油嘴滑舌的 但是系统调用?

    提前感谢

    P.S我真的需要使用 sbrk() 我不能用 mmap() ,不要鼓励我这么做。

    2 回复  |  直到 1 年前
        1
  •  2
  •   Joshua    1 年前

    在这种情况下,不要使用 -nostdlib glibc 具有特殊的更换支持 malloc()

    这应该能够 sbrk() 工作。不要启动多个线程,否则你会头疼的。

    如果你找不到 sbrk() 呼叫 mmap() 相反 sbrk() 是过时的,与现代系统设施的交互不太好。

        2
  •  1
  •   zwol    1 年前

    如果您正在做听起来像您正在尝试做的事情,那么您最终将不得不编写您所需的所有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在这种模式下无法正常工作;不要使用中的任何内容 stdio.h ,也没有任何与区域设置相关的内容(正如C标准所使用的术语),也没有与线程有关的内容。不过,系统调用包装器应该很好,大多数 string.h