Note that there are some explanatory texts on larger screens.

plurals
  1. POreplace a dynamic shared library in run time
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload