Я создал следующую общую библиотеку и хотел использовать функции, определенные в библиотеке, в другом файле c.
Заголовочный файл:
#ifndef _MY_MALLOC_H_
#define _MY_MALLOC_H_
#include <dlfcn.h>
#include <stdio.h>
extern void* malloc(size_t sz);
extern void free(void *p);
extern int get_total_malloc_requested(void);
#endif
Реализация:
#define _GNU_SOURCE
#include "my_malloc.h"
static int num_times_malloc_called = 0;
static int num_times_free_called = 0;
void* malloc(size_t sz)
{
void *(*libc_malloc)(size_t) = dlsym(RTLD_NEXT, "malloc");
num_times_malloc_called++;
fprintf(stderr,"malloc called %d\n",num_times_malloc_called);
return libc_malloc(sz);
// return NULL;
}
void free(void *p)
{
void (*libc_free)(void*) = dlsym(RTLD_NEXT, "free");
fprintf(stderr,"free\n");
libc_free(p);
}
int get_total_malloc_requested(void){
return num_times_malloc_called;
}
Не было проблем при создании .so.
gcc -shared -fPIC -o my_malloc.so my_malloc.c -ldl
Нокогда я вызываю get_total_malloc_requested из другого файла .c, я получаю ошибку компоновщика.
#include <stdio.h>
#include <stdlib.h>
#include "my_malloc.h"
int main(){
void *ptr;
ptr = malloc(64); <---no problem here
fprintf(stderr,"called malloc ");
free(ptr);<---no problem here
ptr = malloc(64);
fprintf(stderr,"called malloc ");
free(ptr);
get_total_malloc_requested();<---linker doesn't find the symbol
return 0;
}
gcc hello.c -o hello.o -L ./my_malloc.c
ld: warning: -L path './my_malloc.c' is not a directory
Undefined symbols for architecture x86_64:
"_get_total_malloc_requested", referenced from:
_main in hello-1dfbf1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)