title: replace a dynamic shared library in run time
body: <p>I need to use different dynamic library over a execution cycle of a program. Looking at <code>dlfcn.h</code> I thought this was possible. I confess of not reading much literature on dynamic library loading. </p>
  
  <p>OK here is what I do -</p>
  
  <ul>
  <li>I have created shared library called `libdynamicTest.so.1`
  <li>The main APP opens this solib (<b>dlopen</b>), gets the function pointer (<b>dlsym</b>), run it and then close it back (<b>dlclose</b>)
  </ul>
  
  <p>Everything is fine until here.</p>
  
  <ul>
  <li>Now suppose I replace my libdynamicTest.so.1 by another libdynamicTest.so.1 (some code diff) I see a Segmentation fault. Further I have made sure the solib is replaced after <b>dlclose</b> and before <b>dlopen</b>.
  </ul>
  
  <p>Can someone explain why this segmentation fault ?</p>
  
  <p>I noticed even if I delete libdynamicTest.so.1 the program still executes, quiet strange.</p>
  
  <pre><code>    SysTrace(("opening dynamic library"));
      handle = dlopen("libdynamicTest.so.1",RTLD_LAZY);
      fn     = dlsym (handle,"dylib_print_msg");
      SysTrace(("Using dynamic library"));
      if(!fn)
      {
          printf("unknown dylib_print_msg..!!\n");
      }
      else
      {
          (*fn)();
      }
      ret = dlclose(handle);
      SysTrace(("closed dynamic library status = [%s]", (ret==0?"OK":"NOK")));
  </code></pre>
  
  <p>P.S. I am not trying to modify the behavior of any existing program, nor pose any threat. I was doing a feasibility check to run integration tests as shared libraries.</p>
  
  <hr>
  
  <p>edit                                                                         </p>
  
  <p>I tried with gdb, following is the stack trace, when the fault occurred.</p>
  
  <pre><code>Program received signal SIGSEGV, Segmentation fault.
  0x0000003e92408b7b in check_match.8509 () from /lib64/ld-linux-x86-64.so.2
  #0  0x0000003e92408b7b in check_match.8509 ()
     from /lib64/ld-linux-x86-64.so.2
  #1  0x0000003e92409024 in do_lookup_x () from /lib64/ld-linux-x86-64.so.2
  #2  0x0000003e92409222 in _dl_lookup_symbol_x ()
     from /lib64/ld-linux-x86-64.so.2
  #3  0x0000003e92908f14 in do_sym () from /lib64/libc.so.6
  #4  0x0000003e93001104 in dlsym_doit () from /lib64/libdl.so.2
  #5  0x0000003e9240ced6 in _dl_catch_error ()
     from /lib64/ld-linux-x86-64.so.2
  #6  0x0000003e9300150d in _dlerror_run () from /lib64/libdl.so.2
  #7  0x0000003e930010ba in dlsym () from /lib64/libdl.so.2
  </code></pre>
  
  <hr>
  
  <p>edit</p>
  
  <p>code base shared at svn checkout <code>http://subversion.assembla.com/svn/dynamic_libso</code></p>
  
  <hr>
  
  <p>edit :- added logs LD_DEBUG=all</p>
  
  <pre><code>32564:     binding file ./test_agent [0] to /lib64/libc.so.6 [0]: normal symbol `__libc_start_main' [GLIBC_2.2.5]
       32564:
       32564:     initialize program: ./test_agent
       32564:
       32564:
       32564:     transferring control: ./test_agent
       32564:
       32564:     symbol=printf;  lookup in file=./test_agent [0]
       32564:     symbol=printf;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     symbol=printf;  lookup in file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]
       32564:     symbol=printf;  lookup in file=/lib64/libc.so.6 [0]
       32564:     binding file ./test_agent [0] to /lib64/libc.so.6 [0]: normal symbol `printf' [GLIBC_2.2.5]
       32564:     symbol=putchar;  lookup in file=./test_agent [0]
       32564:     symbol=putchar;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     symbol=putchar;  lookup in file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]
       32564:     symbol=putchar;  lookup in file=/lib64/libc.so.6 [0]
       32564:     binding file ./test_agent [0] to /lib64/libc.so.6 [0]: normal symbol `putchar' [GLIBC_2.2.5]
  -hello.c main():20 Msg : hello world ..!!
  -hello.c main():24 Msg : opening dynamic library
       32564:     symbol=dlopen;  lookup in file=./test_agent [0]
       32564:     symbol=dlopen;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     binding file ./test_agent [0] to /lib64/libdl.so.2 [0]: normal symbol `dlopen' [GLIBC_2.2.5]
       32564:     opening file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]; direct_opencount=1
       32564:
       32564:     symbol=dlerror;  lookup in file=./test_agent [0]
       32564:     symbol=dlerror;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     binding file ./test_agent [0] to /lib64/libdl.so.2 [0]: normal symbol `dlerror' [GLIBC_2.2.5]
  -hello.c main():26 Msg : Opened dynamic library handle = [a16d9000]
       32564:     symbol=dlsym;  lookup in file=./test_agent [0]
       32564:     symbol=dlsym;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     binding file ./test_agent [0] to /lib64/libdl.so.2 [0]: normal symbol `dlsym' [GLIBC_2.2.5]
       32564:     symbol=_dl_sym;  lookup in file=./test_agent [0]
       32564:     symbol=_dl_sym;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     symbol=_dl_sym;  lookup in file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]
       32564:     symbol=_dl_sym;  lookup in file=/lib64/libc.so.6 [0]
       32564:     binding file /lib64/libdl.so.2 [0] to /lib64/libc.so.6 [0]: normal symbol `_dl_sym' [GLIBC_PRIVATE]
       32564:     symbol=solib_print_msg;  lookup in file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]
       32564:     binding file /user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0] to /user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]: normal symbol `solib_print_msg'
  -hello.c main():28 Msg : Using dynamic library
       32564:     symbol=printf;  lookup in file=./test_agent [0]
       32564:     symbol=printf;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     symbol=printf;  lookup in file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]
       32564:     symbol=printf;  lookup in file=/lib64/libc.so.6 [0]
       32564:     binding file /user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0] to /lib64/libc.so.6 [0]: normal symbol `printf' [GLIBC_2.2.5]
       32564:     symbol=putchar;  lookup in file=./test_agent [0]
       32564:     symbol=putchar;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     symbol=putchar;  lookup in file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]
       32564:     symbol=putchar;  lookup in file=/lib64/libc.so.6 [0]
       32564:     binding file /user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0] to /lib64/libc.so.6 [0]: normal symbol `putchar' [GLIBC_2.2.5]
  -dynamic.c solib_print_msg():9 Msg : nice nice..!!
       32564:     symbol=dlclose;  lookup in file=./test_agent [0]
       32564:     symbol=dlclose;  lookup in file=/lib64/libdl.so.2 [0]
       32564:     binding file ./test_agent [0] to /lib64/libdl.so.2 [0]: normal symbol `dlclose' [GLIBC_2.2.5]
       32564:
       32564:     closing file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1; direct_opencount=0
  -hello.c main():40 Msg : closed dynamic library status = [OK]
  -hello.c main():24 Msg : opening dynamic library
       32564:     opening file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]; direct_opencount=1
       32564:
  -hello.c main():26 Msg : Opened dynamic library handle = [0]
       32564:     symbol=solib_print_msg;  lookup in file=/user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]
       32564:     binding file /user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0] to /user/skm/coding/fTest/approach/dynamic_library/gravity/contribs/libs/libdynamicTest.so.1 [0]: normal symbol `solib_print_msg'
  -hello.c main():28 Msg : Using dynamic library
  Segmentation fault
  </code></pre>