1

dlopen を使用して libc メモリ割り当て関数のハンドルを取得する方法を教えてもらえますか? 特に、libc パスを検索してからハンドルを取得するようなものです。dlsym を呼び出すには、どのモードを使用する必要がありますか?

アイデアは次のとおりです。

  1. libc パスを検索
  2. その上で dlopen を呼び出します
  3. dlsym を使用してメモリ関数 (malloc、calloc など) にアクセスし、
  4. 関数を使用する

上記の 4 つの手順のコード スニペットを教えてください。

4

2 に答える 2

5

コード スニペット、HTH を次に示します。

#include <dlfcn.h>
#include <stdio.h>
int main()
{  
   void *handle; 

   // dlopen will search the path for you
   // /usr/lib/libc.so is a linker script, not an elf file
   // so it won't work with dlopen. 
   handle = dlopen("libc.so.6", RTLD_LAZY); 

   if(handle){
         void* (*mallocptr)(size_t);
         void (*freeptr)(void*);

         // Locate symbols
         *(void**)(&mallocptr) = dlsym(handle, "malloc");
         *(void**)(&freeptr) = dlsym(handle, "free");

         if(!mallocptr || !freeptr){
            printf("%s\n", dlerror());
            return 1;
         }

         // Allocate and use memory
         char *ptr = (*mallocptr)(4);
         ptr[0] = 'H'; ptr[1] = 'i'; ptr[2] = '\n'; ptr[3] = '\0';
         printf(ptr);

         // Free it
         (*freeptr)(ptr);
   }
   else{
      printf("%s\n", dlerror());
      return 1;
   }
   return 0;
}
于 2011-07-27T09:01:10.843 に答える