title: How to use __malloc_hook?
body: <p>In <em>GNU C Library Reference Manual</em>, there is an example program(p.65), But I don't know what the three sentences: 
  <code>__malloc_hook = old_malloc_hook;</code> 
  <code>old_malloc_hook = __malloc_hook;</code> 
  <code>__malloc_hook = my_malloc_hook;</code> 
  mean. Especailly the second one, who can explain for me? thanks.</p>
  
  <pre><code>static void *
  my_malloc_hook (size_t size, const void *caller)
  {
      void *result;
      /* Restore all old hooks */
      __malloc_hook = old_malloc_hook;
      __free_hook = old_free_hook;
      /* Call recursively */
      result = malloc (size);
      /* Save underlying hooks */
      old_malloc_hook = __malloc_hook;
      old_free_hook = __free_hook;
      /* printf might call malloc, so protect it too. */
      printf ("malloc (%u) returns %p\n", (unsigned int) size, result);
      /* Restore our own hooks */
      __malloc_hook = my_malloc_hook;
      __free_hook = my_free_hook;
      return result;
  }
  </code></pre>
  
  <p>I write a little program to test it:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;malloc.h&gt;
  
  /* Prototypes for our hooks.  */
  static void my_init_hook(void);
  static void *my_malloc_hook(size_t, const void *);
  
  /* Variables to save original hooks. */
  static void *(*old_malloc_hook) (size_t, const void *);
  
  /* Override initializing hook from the C library. */
  void (*__malloc_initialize_hook) (void) = my_init_hook;
  
  static void my_init_hook(void)
  {
      old_malloc_hook = __malloc_hook;
      __malloc_hook = my_malloc_hook;
  }
  
  static void *my_malloc_hook(size_t size, const void *caller)
  {
      void *result;
  
      /* Restore all old hooks */
      __malloc_hook = old_malloc_hook;
  
          printf("1: __malloc_hook = %x  old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
      /* Call recursively */
      result = malloc(size);
  
          printf("2: __malloc_hook = %x  old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
  
  
      /* Save underlying hooks */
      old_malloc_hook = __malloc_hook;
  
          printf("3: __malloc_hook = %x  old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
      /* printf() might call malloc(), so protect it too. */
      printf("malloc(%u) called from %p returns %p\n",
             (unsigned int)size, caller, result);
  
      /* Restore our own hooks */
      __malloc_hook = my_malloc_hook;
          printf("4: __malloc_hook = %x  old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
  
      return result;
  }
  
  int main(void)
  {
          char *p;
          p = malloc(10);
          free(p);
          return 0;
  }
  </code></pre>
  
  <p>the result of the program is :</p>
  
  <pre><code>1: __malloc_hook = 0  old_malloc_hook = 0
  2: __malloc_hook = 0  old_malloc_hook = 0
  3: __malloc_hook = 0  old_malloc_hook = 0
  malloc(10) called from 0xb7797f38 returns 0x932c008
  4: __malloc_hook = 804849d  old_malloc_hook = 0
  </code></pre>
  
  <p>but now I have more problems, why <code>old_malloc_hook</code> are all 0, in 1,2,3, why <code>__malloc_hook</code> are 0? I am really confused. Help me.</p>