Hyperlink 我的共享库中的运行时未定义错误

Hyperlink 我的共享库中的运行时未定义错误,hyperlink,malloc,undefined,customization,symbols,Hyperlink,Malloc,Undefined,Customization,Symbols,我在定制的malloc()中面临一个问题 我的软件 首先,让我解释一下我的软件: 我的软件很大,由多个静态库组成。作为一个静态库,它具有定制的malloc(),其主要功能是在从glibc调用mall()的顶部提供一种专有的内存跟踪器。目前,自定义的malloc()仅在我的系统中的部分应用程序可用,而不是所有应用程序。我的目标是将定制的malloc()链接到我系统上运行的每个应用程序。在我之前的文章中,我问为什么在运行时会显示“undefined sysmbol”,尽管我使用了LTLD_LAZY标

我在定制的
malloc()
中面临一个问题

我的软件 首先,让我解释一下我的软件: 我的软件很大,由多个静态库组成。作为一个静态库,它具有定制的
malloc()
,其主要功能是在从glibc调用
mall()
的顶部提供一种专有的内存跟踪器。目前,自定义的
malloc()
仅在我的系统中的部分应用程序可用,而不是所有应用程序。我的目标是将定制的
malloc()
链接到我系统上运行的每个应用程序。在我之前的文章中,我问为什么在运行时会显示“undefined sysmbol”,尽管我使用了LTLD_LAZY标志。结果是我的代码不正确。所以我修正了我的代码。问题解决了。但我仍然有一个问题。让我先解释一下我的代码

  • 普通猫

    #include <stdio.h>
    #include <stdlib.h>
    
    void *gp_malloc(size_t size) {
        void *ptr;
        ptr = malloc(size);
        fprintf(stderr, "%s: size(%d) = %p\n", __func__, (int)size, ptr);
        return ptr;
    }
    
    void gp_free(void *ptr) {
        free(ptr);
        fprintf(stderr, "%s free=%p\n", __func__, ptr);
    }
    
  • cat Makefile_新

    LOCAL_PATH=${shell pwd}
    all:
            gcc -c -Wall -fPIC -o my_malloc.o -c my_malloc.c
            gcc -O2 -Wall -shared -fPIC -o libmy_malloc.so my_malloc.o
    #       This shared library is built with Makefile_exist
    #       gcc -O2 -Wall -shared -fPIC -o libcommon.so common.c
            gcc -L${LOCAL_PATH} -g -Wall -D COMPILE_TIME_MY_MALLOC -o hello_new hello_new.c -lmy_malloc -ldl
    
  • cat Makefile_存在

    LOCAL_PATH=${shell pwd}
    all:
            gcc -c -Wall -o my_static.o -c my_static.c
            ar -rc libmy_static.a my_static.o
    
            gcc -O2 -Wall -shared -fPIC -o libcommon.so common.c
            gcc -L${LOCAL_PATH}  -g -Wall -o hello_exist hello_exist.c  -lcommon -lmy_static -ldl
    
  • 为了构建映像,按顺序运行Makefile_exist、Makefile_new,以便创建hello_new。(Makefile_exist/Makefile_new是我的makefiles的简化版本。前者是我使用的版本。后者是我将应用于其他应用程序的版本)

    当我运行
    hello\u new
    时,我得到了
    gp\u malloc
    两次。我理解第一个。是什么原因导致第二个
    gp_malloc()

    /你好! my_malloc尺寸=10 gp_malloc:尺寸(10)=0x7fffe0d5b900 my_free:启动0x7fffe0d5b900 gp_malloc:size(-522864384)=(nil)//调用此函数的原因。
    如果您有任何建议,我们将不胜感激。

    另一个想法是不要使用任何自制的malloc。真正地如果您有内存分配问题,请使用valgrind查找。嘿!你的问题非常详细-但是在你进入系统的细节之前,你能从一个简单的问题陈述开始(例如,你想做什么以及它是如何失败的)吗?你可以使用C预处理器将所有对
    malloc()
    的调用替换为对
    my_malloc()
    ,它调用
    gp_malloc()
    ,它依次调用ambiant
    malloc()
    函数。对于
    calloc()
    realloc()
    strdup()
    ,您有相同的钩子吗?您是否也安装了免费的
    free()
    gp\u malloc()
    是否返回它从
    malloc()
    获取的指针,或者是否在块中存储辅助信息并返回修改过的指针?你能发布你收到的链接错误吗?谢谢大家的回复。我被要求坚持现有的自制马洛克。在我写第一篇文章之前进行测试时,我的代码中也有一个问题。修复后,我发布了我使用的所有代码。我将拥有calloc()、realloc()的钩子。但是我没有想到strdup()。特别感谢你,切丽。
    #include <stdio.h>
    #include <stdlib.h>
    #include "my_malloc.h"
    
    int main(void) {
        char *ptr;
        ptr = malloc(10);
        free(ptr);
    }
    
    #include <stdio.h>
    
    void aaa(void) {
        printf("I am in aaa\n");
    }
    
    #ifdef COMPILE_TIME_MY_MALLOC
    #define malloc(size) my_malloc(size)
    #define free(ptr) my_free(ptr)
    void *my_malloc(size_t size);
    void my_free(void *ptr);
    #endif
    
    LOCAL_PATH=${shell pwd}
    all:
            gcc -c -Wall -fPIC -o my_malloc.o -c my_malloc.c
            gcc -O2 -Wall -shared -fPIC -o libmy_malloc.so my_malloc.o
    #       This shared library is built with Makefile_exist
    #       gcc -O2 -Wall -shared -fPIC -o libcommon.so common.c
            gcc -L${LOCAL_PATH} -g -Wall -D COMPILE_TIME_MY_MALLOC -o hello_new hello_new.c -lmy_malloc -ldl
    
    LOCAL_PATH=${shell pwd}
    all:
            gcc -c -Wall -o my_static.o -c my_static.c
            ar -rc libmy_static.a my_static.o
    
            gcc -O2 -Wall -shared -fPIC -o libcommon.so common.c
            gcc -L${LOCAL_PATH}  -g -Wall -o hello_exist hello_exist.c  -lcommon -lmy_static -ldl
    
    ./hello_new my_malloc size=10 gp_malloc: size(10) = 0x7fffe0d5b900 my_free: start 0x7fffe0d5b900 gp_malloc: size(-522864384) = (nil) //what causes this to be called.