aboutsummaryrefslogtreecommitdiff
path: root/04_dynld_nostd/libgreet.c
diff options
context:
space:
mode:
Diffstat (limited to '04_dynld_nostd/libgreet.c')
-rw-r--r--04_dynld_nostd/libgreet.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/04_dynld_nostd/libgreet.c b/04_dynld_nostd/libgreet.c
new file mode 100644
index 0000000..f90bdbf
--- /dev/null
+++ b/04_dynld_nostd/libgreet.c
@@ -0,0 +1,29 @@
+// Copyright (c) 2020 Johannes Stoelp
+
+#include <io.h>
+
+int gCalled = 0;
+
+const char* get_greet() {
+ // Reference global variable -> generates RELA relocation (R_X86_64_GLOB_DAT).
+ ++gCalled;
+ return "Hello from libgreet.so!";
+}
+
+const char* get_greet2() {
+ // Reference global variable -> generates RELA relocation (R_X86_64_GLOB_DAT).
+ ++gCalled;
+ return "Hello 2 from libgreet.so!";
+}
+
+// Definition of `static` function which is referenced from the `INIT` dynamic
+// section entry -> generates R_X86_64_RELATIVE relocation.
+__attribute__((constructor)) static void libinit() {
+ pfmt("libgreet.so: libinit\n");
+}
+
+// Definition of `non static` function which is referenced from the `FINI`
+// dynamic section entry -> generates R_X86_64_64 relocation.
+__attribute__((destructor)) void libfini() {
+ pfmt("libgreet.so: libfini\n");
+}