summaryrefslogtreecommitdiff
path: root/tests/libs/ld_config_test_helper_lib3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/libs/ld_config_test_helper_lib3.cpp')
-rw-r--r--tests/libs/ld_config_test_helper_lib3.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/tests/libs/ld_config_test_helper_lib3.cpp b/tests/libs/ld_config_test_helper_lib3.cpp
index 93d1cd81d..94e15704d 100644
--- a/tests/libs/ld_config_test_helper_lib3.cpp
+++ b/tests/libs/ld_config_test_helper_lib3.cpp
@@ -1,3 +1,23 @@
-int get_value_from_another_lib() {
- return 54321;
+#include <dlfcn.h>
+#include <stdio.h>
+
+// Mark foo and bar weak so that Clang allows the run-time linker to decide which DSO's symbol to
+// use.
+
+__attribute__((weak)) extern "C" void foo() {
+ printf("foo lib3\n");
+ void (*next)(void) = reinterpret_cast<void (*)()>(dlsym(RTLD_NEXT, "foo"));
+ if (next != nullptr) next();
+}
+
+__attribute__((weak)) extern "C" void bar() {
+ printf("bar lib3\n");
+ void (*next)(void) = reinterpret_cast<void (*)()>(dlsym(RTLD_NEXT, "bar"));
+ if (next != nullptr) next();
+}
+
+void lib3_call_funcs() {
+ printf("lib3_call_funcs\n");
+ foo();
+ bar();
}