Проблема с кодом оболочки malloc - PullRequest
1 голос
/ 03 августа 2011

Я сталкиваюсь с SIGEV с этим кодом оболочки malloc, кто-нибудь может мне помочь?

enter code here
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>

void *handle;
static void* (*ef_libc_malloc) (size_t);
static void* (*ef_libc_calloc) (size_t, size_t);
static void init1() __attribute__ ((constructor));

void *malloc(size_t size)
{
 return (*ef_libc_malloc)(size);
}

void *calloc(size_t nmemb, size_t size)
{
 return (*ef_libc_calloc)(nmemb, size);
}

void init1()
{

 //handle=dlopen("/devel/lib/libc.so.6",RTLD_LAZY);
 handle=dlopen("libc.so.6",RTLD_LAZY);
 if(!handle) {
 printf("dlopen failed\n");
exit(1);    
  }
 ef_libc_malloc = dlsym(handle, "malloc"); 
 if(!ef_libc_malloc) {
 printf("Could not resolve malloc in libc.so\n");
  }

  ef_libc_calloc = dlsym(handle, "calloc"); 
  if(!ef_libc_calloc) {
 printf("Could not resolve calloc in libc.so\n");
  }
 }

  int main()
  {
   char *ptr;

   ptr=(char*)malloc(20);
   strcpy(ptr,"jghjghbj");
   puts(ptr);
  }

Вот обратная трассировка GDB:

enter code here
(gdb) r
 Starting program: /usr/local/arm-sony-linux-gnueabi/target/arm/tmp/efence/a.out 

 Program received signal SIGSEGV, Segmentation fault.

 0x00000000 in ?? ()
 (gdb) bt 
 #0  0x00000000 in ?? ()
 #1  0x080484c8 in malloc (size=20) at dlopen10.c:13
 #2  0x0067cb42 in _dl_map_object_deps () from /lib/ld-linux.so.2
 #3  0x00681aed in dl_open_worker () from /lib/ld-linux.so.2
 #4  0x0067de26 in _dl_catch_error () from /lib/ld-linux.so.2
 #5  0x00681472 in _dl_open () from /lib/ld-linux.so.2
 #6  0x00803c4d in dlopen_doit () from /lib/libdl.so.2
 #7  0x0067de26 in _dl_catch_error () from /lib/ld-linux.so.2
 #8  0x008042cc in _dlerror_run () from /lib/libdl.so.2
 #9  0x00803b84 in dlopen@@GLIBC_2.1 () from /lib/libdl.so.2
 #10 0x08048501 in init1 () at dlopen10.c:25
 #11 0x0804866b in __do_global_ctors_aux ()
 #12 0x0804836d in _init ()
 #13 0x080485f9 in __libc_csu_init ()
 #14 0x006a8e41 in __libc_start_main () from /lib/libc.so.6
 #15 0x08048401 in _start ()
 (gdb) q
 The program is running.  Exit anyway? (y or n) y

Я не могу найти основную причину. Пожалуйста, помогите мне решить эту проблему. Пожалуйста, помогите мне.

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Согласно вашей трассировке стека dlopen (которую вы вызываете во время инициализации) внутренне вызывает malloc на некоторой стадии.Здесь называется ваша реализация malloc, которая в свою очередь вызывает ef_libc_malloc.Но это еще не инициализировано!Это NULL.

1 голос
/ 03 августа 2011

Похоже, что загрузка libc.so в неподходящее время вызывает проблему.Попробуйте без загрузки:

dlsym(RTLD_NEXT, "malloc");
1 голос
/ 03 августа 2011

Основная причина, по-видимому, заключается в использовании malloc из вызова dlopen в вашей функции init1.Во время dlopen переменная ef_libc_malloc имеет значение null, что вызывает SIGSEGV, поскольку dlopen использует вашу локальную подпрограмму malloc, а не ту, что в libc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...