Я столкнулся с одной проблемой в моем настроенном malloc()
.
Мое программное обеспечение
Прежде всего, позвольте мне объяснить свое программное обеспечение: мое программное обеспечение огромно и состоит из нескольких c библиотек. Одна из библиотек stati c имеет настроенный malloc()
, основная функция которого - своего рода проприетарный трассировщик памяти поверх вызова mall()
из glib c. В настоящее время настроенный malloc()
доступен только для некоторых приложений, но не для всех приложений в моей системе. Моя цель - связать настроенный malloc()
с каждым приложением, работающим в моей системе. В моем предыдущем посте я спросил, почему во время выполнения отображается undefined sysmbol, хотя я использовал флаг LTLD_LAZY. Оказалось, что мой код неверен. Итак, я исправил свой код. И вопрос решен. Но все же у меня есть проблема. Позвольте мне сначала объяснить свой код.
обыкновенный кот. 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);
}
кот 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();
}
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);
}
cat hello_new. c
#include <stdio.h>
#include <stdlib.h>
#include "my_malloc.h"
int main(void) {
char *ptr;
ptr = malloc(10);
free(ptr);
}
cat my_stati c. c
#include <stdio.h>
void aaa(void) {
printf("I am in aaa\n");
}
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
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
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.
Мы будем очень признательны за любые предложения.