【发布时间】:2021-08-02 05:16:05
【问题描述】:
我一直在尝试实现一个小型模拟来了解 malloc() 的内存分配。我创建了一个名为 mem.c 的共享库。我将库链接到主库,但无法传递模拟“堆”的正确地址。堆是由共享库中的 malloc() 调用创建的。
共享库中的地址:0x55ddaff662a0 主地址:0xffffffffaff662a0
似乎只有最后 4 个字节是正确的。休息设置为 0xf。
但是,当我在 main 中 #include "mem.c" 时,它可以正常工作。在不包括 mem.c 的情况下如何获得相同的结果。我试图在不包括 mem.c 或 mem.h 的情况下解决这个问题。我这样创建共享库:
gcc -c -fpic mem.c
gcc -shared -o libmem.so mem.o
gcc main.c -lmem -L. -o main
【问题讨论】:
-
library called mem.c会很不寻常。您正在尝试的一个小例子会有所帮助。此外,地址的最后 4 个字节似乎是相同的。你过得怎么样? -
创建一个文件
mem.h,其中包含main()中所需的任何函数的原型。在您的程序源中包含mem.h,然后链接到mem.c的目标文件或库libmem(如果您创建了一个)。如果您只需要一个地址,您可以在程序源中使用声明为extern的简单变量。 -
我正在尝试不使用 #include mem.h 或 mem.c 来实现。我需要从主库和共享库中获取相同的地址值,但只能正确获取最后 4 个字节。我以这种方式创建了模拟的“堆”:char *heap = (char *)malloc(sizeof(char) * n);。我这样返回地址:return heap;。实现的 malloc 函数只返回最后 4 个字节。 @Zoso
-
通过“共享库”,您的意思是您在运行时将您的库与 libdl 链接?
-
@humbleLearner 没有声明它认为定义是
int getAddr()
标签: c linux bash pointers shared-libraries