summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFreeArtMan <dos21h@gmail.com>2022-08-12 14:51:12 +0100
committerFreeArtMan <dos21h@gmail.com>2022-08-12 14:51:12 +0100
commit4fe12ecb448214f5c449ad5b821df5d450ade76f (patch)
treeb0343194a768339159d710b83d36299af440c487
parent476d1f5deaf8a2982256d0d978a3ce99ae68723e (diff)
downloadmd-content-4fe12ecb448214f5c449ad5b821df5d450ade76f.tar.gz
md-content-4fe12ecb448214f5c449ad5b821df5d450ade76f.zip
Add shared
-rw-r--r--md/notes/undefined_c/titles.md94
1 files changed, 94 insertions, 0 deletions
diff --git a/md/notes/undefined_c/titles.md b/md/notes/undefined_c/titles.md
index 158ed20..7753e65 100644
--- a/md/notes/undefined_c/titles.md
+++ b/md/notes/undefined_c/titles.md
@@ -553,6 +553,88 @@ https://panthema.net/2013/0124-GCC-Output-Assembler-Code/
https://blogs.oracle.com/linux/post/making-code-more-secure-with-gcc-part-1
+### Shared library
+
+Shared library is common way how to reuse big chunks of code.
+
+```c
+#include <stdio.h>
+int fun1() {
+ return 1;
+}
+
+int fun2() {
+ printf("Function name fun2\n");
+}
+
+int fun3(int a, int b) {
+ return a+b;
+}
+```
+
+```
+$ gcc -c lib_share.c
+$ gcc -shared -o lib_share.so libshare.o
+$ ldd lib_share.so
+ linux-vdso.so.1 (0x00007ffdb994d000)
+ libc.so.6 => /usr/lib/libc.so.6 (0x00007f0c39400000)
+ /usr/lib64/ld-linux-x86-64.so.2 (0x00007f0c39835000)
+```
+
+Now lets link to our binary
+```c
+#include <stdio.h>
+
+//functions that are implemented in shared lib
+int fun1();
+int fun2();
+int fun3(int a, int b);
+
+int main() {
+ fun1();
+ fun2();
+ fun3();
+}
+```
+
+```
+$ gcc -L. -lshare use_share.c -o use_share
+./use_share
+./use_share: error while loading shared libraries: libshare.so: cannot open shared object file: No such file or directory
+ldd ./use_share
+ linux-vdso.so.1 (0x00007ffedcad5000)
+ libshare.so => not found
+ libc.so.6 => /usr/lib/libc.so.6 (0x00007f7b99a00000)
+ /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f7b99c90000)
+```
+
+Library is not in search path
+```
+$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
+$ ./use_share
+$ ldd use_share
+ linux-vdso.so.1 (0x00007fffc415c000)
+ libshare.so => /your/path/libshare.so (0x00007f48b03c6000)
+ libc.so.6 => /usr/lib/libc.so.6 (0x00007f48b0000000)
+ /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f48b03d2000)
+```
+
+Other way is to set custom library search location. Lets set it to search in current directory.
+And no need to modify LD_LIBRARY_PATH
+
+```
+$ gcc use_share.c -o use_share -L. -lshare -Wl,-rpath=./
+$ ldd ./use_share
+ linux-vdso.so.1 (0x00007fff5c964000)
+ libshare.so => ./libshare.so (0x00007f791000f000)
+ libc.so.6 => /usr/lib/libc.so.6 (0x00007f790fc00000)
+ /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f791001b000)
+```
+
+So now executable runs libshare from local directory. Ofc there is possible to install shared library into systems /usr/lib
+
+### Static library
+
### Static binary
Static binary don't use any shared libraries, and its possible to built it once and distribute on other platforms
@@ -593,8 +675,19 @@ $ ldd static_elf
Statically compiled file should work on most platforms.
+
+
### Dynamic binary
+Dynamic binary is required to load dynamically linked libraries, they must be in known location.
+
+Replacing dynamic libraries with your own
+
+
+
+Point to custom location of dynamic library
+
+
### stdin,stdout,stderr
@@ -605,6 +698,7 @@ Statically compiled file should work on most platforms.
+
## Basic usage
### File manipulation with libc