diff options
Diffstat (limited to 'lib/mlibc/tests/rtdl/soname')
-rw-r--r-- | lib/mlibc/tests/rtdl/soname/libbar.c | 1 | ||||
-rw-r--r-- | lib/mlibc/tests/rtdl/soname/libfoo.c | 1 | ||||
-rw-r--r-- | lib/mlibc/tests/rtdl/soname/meson.build | 17 | ||||
-rw-r--r-- | lib/mlibc/tests/rtdl/soname/test.c | 33 |
4 files changed, 52 insertions, 0 deletions
diff --git a/lib/mlibc/tests/rtdl/soname/libbar.c b/lib/mlibc/tests/rtdl/soname/libbar.c new file mode 100644 index 0000000..7f9f475 --- /dev/null +++ b/lib/mlibc/tests/rtdl/soname/libbar.c @@ -0,0 +1 @@ +char *name() { return "bar"; } diff --git a/lib/mlibc/tests/rtdl/soname/libfoo.c b/lib/mlibc/tests/rtdl/soname/libfoo.c new file mode 100644 index 0000000..abe0999 --- /dev/null +++ b/lib/mlibc/tests/rtdl/soname/libfoo.c @@ -0,0 +1 @@ +char *name() { return "foo"; } diff --git a/lib/mlibc/tests/rtdl/soname/meson.build b/lib/mlibc/tests/rtdl/soname/meson.build new file mode 100644 index 0000000..1eb97a8 --- /dev/null +++ b/lib/mlibc/tests/rtdl/soname/meson.build @@ -0,0 +1,17 @@ +# Create two libraries with the same SONAME. +bar_soname = '-Wl,-soname=libbar.so' + +libfoo = shared_library('foo', 'libfoo.c', link_args: '-Wl,-soname=libbar.so') +libbar = shared_library('bar', 'libbar.c', link_args: '-Wl,-soname=libbar.so') +test_depends = [libfoo, libbar] + +libfoo_native = shared_library('native-foo', 'libfoo.c', + link_args: ['-ldl', '-Wl,-soname=libnative-bar.so'], + native: true +) +libbar_native = shared_library('native-bar', 'libbar.c', + link_args: ['-ldl', '-Wl,-soname=libnative-bar.so'], + native: true +) +test_native_depends = [libfoo_native, libbar_native] + diff --git a/lib/mlibc/tests/rtdl/soname/test.c b/lib/mlibc/tests/rtdl/soname/test.c new file mode 100644 index 0000000..23e5b7a --- /dev/null +++ b/lib/mlibc/tests/rtdl/soname/test.c @@ -0,0 +1,33 @@ +#include <dlfcn.h> +#include <stdio.h> +#include <assert.h> +#include <string.h> + +#ifdef USE_HOST_LIBC +#define LIBFOO "libnative-foo.so" +#define LIBBAR "libnative-bar.so" +#else +#define LIBFOO "libfoo.so" +#define LIBBAR "libbar.so" +#endif + +int main() { + void *foo = dlopen(LIBFOO, RTLD_NOW); + void *bar = dlopen(LIBBAR, RTLD_NOW); + assert(foo); + assert(bar); + + // Since these libraries have the same SONAME, they should return the same thing. + assert(foo == bar); + + char *(*fooSym)(void) = dlsym(foo, "name"); + char *(*barSym)(void) = dlsym(bar, "name"); + assert(fooSym && barSym); + assert(fooSym() && barSym()); + printf("foo: name() = \"%s\"\n", fooSym()); + printf("bar: name() = \"%s\"\n", barSym()); + assert(!strcmp(fooSym(), barSym())); + + dlclose(foo); + dlclose(bar); +} |