Ошибка компоновщика при использовании функции, определенной в пользовательской общей библиотеке - PullRequest
0 голосов
/ 19 сентября 2019

Я создал следующую общую библиотеку и хотел использовать функции, определенные в библиотеке, в другом файле 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)

1 Ответ

3 голосов
/ 19 сентября 2019

Вы создали общий объект, но не создаете исполняемый файл для его использования.Поскольку исполняемый файл не использует его, указанный символ не найден.

Удалите лишнюю опцию -L и укажите общий объект при связывании.

gcc hello.c -o hello ./my_malloc.so
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...