2011-08-03 5 views
1

このmallocラッパーコードで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 [email protected]@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 

私は根本的な原因を見つけることができないのです。この問題を解決するのを手伝ってください。 私を助けてください。

答えて

1

間違った時刻にlibc.soを読み込むのが問題の原因です。それをロードせずに試してください:

dlsym(RTLD_NEXT, "malloc"); 
+0

ありがとうございました!ちょうど、私はこれを試して、それは働いた。 – kingsmasher1

1

原因は、init1関数のdlopen呼び出し内からmallocを使用しているように見えます。 dlopenの時点で、ef_libc_malloc変数はnullになります。これは、dlopenがlibc内のローカルmallocルーチンを使用するため、SIGSEGVをトリガーします。

+0

どのように解決するのですか? – kingsmasher1

1

スタックトレースdlopen(初期化時に呼び出す)に従って、内部的にmallocを呼び出します。ここではmallocの実装が呼び出され、順番にef_libc_mallocが呼び出されます。しかしまだ初期化されていません!それはNULLです。

+0

どのようにそれを解決するには? – kingsmasher1

関連する問題