Неопределенные ошибки времени выполнения из моей общей библиотеки - PullRequest
2 голосов
/ 09 мая 2020

Я столкнулся с одной проблемой в моем настроенном malloc().

Мое программное обеспечение

Прежде всего, позвольте мне объяснить свое программное обеспечение: мое программное обеспечение огромно и состоит из нескольких c библиотек. Одна из библиотек stati c имеет настроенный malloc(), основная функция которого - своего рода проприетарный трассировщик памяти поверх вызова mall() из glib c. В настоящее время настроенный malloc() доступен только для некоторых приложений, но не для всех приложений в моей системе. Моя цель - связать настроенный malloc() с каждым приложением, работающим в моей системе. В моем предыдущем посте я спросил, почему во время выполнения отображается undefined sysmbol, хотя я использовал флаг LTLD_LAZY. Оказалось, что мой код неверен. Итак, я исправил свой код. И вопрос решен. Но все же у меня есть проблема. Позвольте мне сначала объяснить свой код.

  1. обыкновенный кот. c

    #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);
    }
    
  2. кот my_mallo c. c

    #define _GNU_SOURCE
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
    #include <malloc.h>
    
    static void *handle = NULL;
    static void *(*gp_malloc)(size_t size) = NULL;
    static void (*gp_free)(void *ptr) = NULL;
    
    void *my_malloc(size_t size) {
        char *error;
        void *ptr;
    
        /* dynamically load the shared lib that contains gp_malloc() */
        if (gp_malloc == NULL) {
            handle = dlopen("./libcommon.so", RTLD_LAZY| RTLD_GLOBAL);
            if (!handle) {
                fprintf(stderr, "%s\n", dlerror());
                return NULL;
            }
            /* get a pointer to the gp_malloc() function we just loaded */
            gp_malloc = dlsym(handle, "gp_malloc");
            if ((error = dlerror()) != NULL) {
                fprintf(stderr, "%s\n", error);
                return NULL;
            }
        }
    
        /* Now we can call gp_malloc() just like any other function */
        fprintf(stderr, "%s size=%ld\n", __func__, size);
        ptr = gp_malloc(size);
        return ptr;
    }
    
    void my_free(void *ptr) {
        char *error;
        //void *ptr;
    
        /* dynamically load the shared lib that contains gp_malloc() */
        if (gp_free == NULL) {
            gp_free = dlsym(handle, "gp_malloc");
            if ((error = dlerror()) != NULL) {
                fprintf(stderr, "%s\n", error);
                return;
            }
        }
    
        /* Now we can call gp_malloc() just like any other function */
        fprintf(stderr, "%s: start %p\n", __func__, ptr);
        gp_free(ptr);
    }
    
    void bbb(void) {
        extern void aaa(void);
        aaa();
    }
    
  3. cat hello_exits. c

    #include <stdio.h>
    #include <stdlib.h>
    
    extern void *gp_malloc(int);
    extern void gp_free(void *);
    
    int main(void) {
        char *ptr;
        ptr = gp_malloc(10);
        gp_free(ptr);
        exit(0);
    }
    
  4. cat hello_new. c

    #include <stdio.h>
    #include <stdlib.h>
    #include "my_malloc.h"
    
    int main(void) {
        char *ptr;
        ptr = malloc(10);
        free(ptr);
    }
    
  5. cat my_stati c. c

    #include <stdio.h>
    
    void aaa(void) {
        printf("I am in aaa\n");
    }
    
  6. cat my_mallo c .h

    #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
    
  7. cat Makefile_new

    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
    
  8. cat Makefile_exist

    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 - это упрощенная версия моих файлов makefile. Первую я использую. Последнюю я собираюсь применить к другим приложениям)

Когда я запустил hello_new, я получил gp_malloc дважды. Я понимаю 1-й. Что вызывает 2-е gp_malloc()?

./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.

Мы будем очень признательны за любые предложения.

...