This article covers how to write a dynamic library. It would be good idea to go through C Programming #63: How to write a static library so that comparison be made to dynamic. Same library created in C Programming #63: How to write a static library would be created but this time linked dynamically. First fact.c is to compiled with -fPIC option which will generate object file which position independent code.
$ gcc -c -fPIC fact.c -o fact.o
nm-ing on fact.o we get
$ nm fact.o
0000000000000000 T factorial
U _GLOBAL_OFFSET_TABLE_
Static library can be created of the above object file
$ gcc -shared -o libfact.so fact.o
Running a file command on libfact.so we would get
$ file libfact.so libfact.so: ELF 64-bit LSB shared object, x86-64, \ version 1 (SYSV), dynamically linked, \ BuildID[sha1]=300cf85127a20193ce44f4e93d250413aa64ae10, \ not stripped
Which clearly states that libfact.so is a dynamically linked library. Now main application app.c can be linked to libfact.so as follows
$ gcc -L. -Wl,-rpath=. -o app app.c -lfact
- -L option tells the location search the library while compiling.
- -rpath options tells the location to search library while loading binary
Now running nm, ldd and file on app we get
$ file app app: ELF 64-bit LSB executable, x86-64, \ version 1 (SYSV), dynamically linked, \ interpreter /lib64/ld-linux-x86-64.so.2, \ for GNU/Linux 2.6.32, \ BuildID[sha1]=f8e00e246c64ef10bbc262f79449e842df428b65, \ not stripped $ ldd app linux-vdso.so.1 => (0x00007ffeb4f5e000) libfact.so => ./libfact.so (0x00007faeb00d9000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faeafced000) /lib64/ld-linux-x86-64.so.2 (0x000055912c135000) $ ls -l app -rwxrwxr-x 1 hsk hsk 8640 2016-06-09 17:49 app
You can clearly observe now that it is dynamically linked library, linked to libfact.so and its size is comparatively small to statically linked.
Comparison
- In case of static linked
factorialsymbol was compiled and defined in binary app, while in the dynamically linkedfactorialsymbols is undefined in app, It will get the definition when load the app. - Statically linked binary and huge (here app was 909144) but dynamically linked are smaller (here app is 8640).
- Changing the factorial function would need the whole binary to be compiled in case of statically linked, while in case of dynamically linked we can only compile libfact.so.
- If for some reason in case of dynamically linked the library gets deleted then the app wont run.
$ rm libfact.so $ ./app app: error while loading shared libraries: \ libfact.so: cannot open shared object file: \ No such file or directory
Hope this gives the fair idea about statically linked and dynamically linked library, It would be good idea to revisit with this knowledge the following article - C Programming #34: Journey from source code to executable
Links
- Next Article - C Programming #65: Difference between declaration and definition
- Previous Article - C Programming #63: How to write a static library
- All Article - C Programming
No comments :
Post a Comment