diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 11 | ||||
-rw-r--r-- | elf/restest1.c | 48 | ||||
-rw-r--r-- | elf/testobj1_1.c | 5 |
3 files changed, 62 insertions, 2 deletions
diff --git a/elf/Makefile b/elf/Makefile index a43014a4cb..f6da5c47a0 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -75,7 +75,7 @@ others += ldconfig install-rootsbin += ldconfig endif -tests = loadtest +tests = loadtest restest1 include ../Rules @@ -214,10 +214,12 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \ $(no-whole-archive) $(LDLIBS-$(@F:%.so=%).so) endef -modules-names = testobj1 testobj2 testobj3 +modules-names = testobj1 testobj2 testobj3 testobj1_1 test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names))) generated += $(test-modules) +$(objpfx)testobj1_1.so: $(objpfx)testobj1.so +LDLIBS-testobj1_1.so = $(objpfx)testobj1.so $(objpfx)testobj2.so: $(objpfx)testobj1.so LDLIBS-testobj2.so = $(objpfx)testobj1.so @@ -228,6 +230,11 @@ $(objpfx)loadtest: $(objpfx)libdl.so LDFLAGS-loadtest = -rdynamic $(objpfx)loadtest.out: $(test-modules) + +$(objpfx)restest1: $(objpfx)libdl.so +LDFLAGS-restest1 = -rdynamic $(objpfx)testobj1.so $(objpfx)testobj1_1.so + +$(objpfx)restest1.out: $(test-modules) # muwahaha diff --git a/elf/restest1.c b/elf/restest1.c new file mode 100644 index 0000000000..e4eca557c5 --- /dev/null +++ b/elf/restest1.c @@ -0,0 +1,48 @@ +#include <dlfcn.h> +#include <error.h> +#include <stdio.h> +#include <stdlib.h> + +int +main (void) +{ + void *h1; + int (*fp1) (int); + void *h2; + int (*fp2) (int); + int res1; + int res2; + + h1 = dlopen ("testobj1.so", RTLD_LAZY); + if (h1 == NULL) + error (EXIT_FAILURE, 0, "while loading `%s': %s", "testobj1.so", + dlerror ()); + + h2 = dlopen ("testobj1_1.so", RTLD_LAZY); + if (h1 == NULL) + error (EXIT_FAILURE, 0, "while loading `%s': %s", "testobj1_1.so", + dlerror ()); + + fp1 = dlsym (h1, "obj1func1"); + if (fp1 == NULL) + error (EXIT_FAILURE, 0, "getting `obj1func1' in `%s': %s", + "testobj1.so", dlerror ()); + + fp2 = dlsym (h2, "obj1func1"); + if (fp2 == NULL) + error (EXIT_FAILURE, 0, "getting `obj1func1' in `%s': %s", + "testobj1_1.so", dlerror ()); + + res1 = fp1 (10); + res2 = fp2 (10); + printf ("fp1(10) = %d\nfp2(10) = %d\n", res1, res2); + + return res1 != 42 || res2 != 72; +} + + +int +foo (int a) +{ + return a + 10; +} diff --git a/elf/testobj1_1.c b/elf/testobj1_1.c new file mode 100644 index 0000000000..c0f2aa4678 --- /dev/null +++ b/elf/testobj1_1.c @@ -0,0 +1,5 @@ +int +obj1func1 (int a) +{ + return 42 + obj1func2 (a); +} |