* elf/Makefile: Add rules to build and run order2.

* elf/order2.c: New file.
	* elf/order2mod1.c: New file.
	* elf/order2mod2.c: New file.
	* elf/order2mod3.c: New file.
	* elf/order2mod4.c: New file.
This commit is contained in:
Ulrich Drepper 2005-03-19 08:04:37 +00:00
parent a2f7570bdd
commit 3d786f1969
7 changed files with 128 additions and 3 deletions

View File

@ -1,3 +1,12 @@
2005-03-19 Ulrich Drepper <drepper@redhat.com>
* elf/Makefile: Add rules to build and run order2.
* elf/order2.c: New file.
* elf/order2mod1.c: New file.
* elf/order2mod2.c: New file.
* elf/order2mod3.c: New file.
* elf/order2mod4.c: New file.
2005-03-19 Jakub Jelinek <jakub@redhat.com>
* elf/dl-open.c (dl_open_worker): Print exact l_direct_opencount value,

View File

@ -86,7 +86,8 @@ distribute := rtld-Rules \
tst-deep1mod1.c tst-deep1mod2.c tst-deep1mod3.c \
unload3mod1.c unload3mod2.c unload3mod3.c unload3mod4.c \
unload4mod1.c unload4mod2.c unload4mod3.c unload4mod4.c \
tst-auditmod1.c
tst-auditmod1.c \
order2mod1.c order2mod2.c order2mod3.c order2mod4.c
CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables
@ -161,7 +162,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-align \
tst-align2 $(tests-execstack-$(have-z-execstack)) tst-dlmodcount \
tst-dlopenrpath tst-deep1 tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \
unload3 unload4 unload5 tst-audit1 tst-global1
unload3 unload4 unload5 tst-audit1 tst-global1 order2
# reldep9
test-srcs = tst-pathopt
tests-vis-yes = vismain
@ -198,7 +199,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3 \
tst-dlmopen1mod tst-auditmod1 \
unload3mod1 unload3mod2 unload3mod3 unload3mod4 \
unload4mod1 unload4mod2 unload4mod3 unload4mod4
unload4mod1 unload4mod2 unload4mod3 unload4mod4 \
order2mod1 order2mod2 order2mod3 order2mod4
ifeq (yes,$(have-initfini-array))
modules-names += tst-array2dep
endif
@ -816,3 +818,15 @@ tst-audit1-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so
$(objpfx)tst-global1: $(libdl)
$(objpfx)tst-global1.out: $(objpfx)testobj6.so $(objpfx)testobj2.so
$(objpfx)order2: $(libdl)
$(objpfx)order2.out: $(objpfx)order2 $(objpfx)order2mod1.so \
$(objpfx)order2mod2.so
$(elf-objpfx)$(rtld-installed-name) \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
$(objpfx)order2 > $@
(echo "12345" | cmp $@ -) > /dev/null
$(objpfx)order2mod1.so: $(objpfx)order2mod4.so
$(objpfx)order2mod4.so: $(objpfx)order2mod3.so
$(objpfx)order2mod2.so: $(objpfx)order2mod3.so
order2mod2.so-no-z-defs = yes

46
elf/order2.c Normal file
View File

@ -0,0 +1,46 @@
#include <dlfcn.h>
#include <stdio.h>
int call_puts;
static int
do_test (void)
{
call_puts = 1;
void *h1 = dlopen ("$ORIGIN/order2mod1.so", RTLD_LAZY | RTLD_GLOBAL);
if (h1 == NULL)
{
puts ("cannot load order2mod1");
return 1;
}
void *h2 = dlopen ("$ORIGIN/order2mod2.so", RTLD_LAZY);
if (h2 == NULL)
{
puts ("cannot load order2mod2");
return 1;
}
if (dlclose (h1) != 0)
{
puts ("dlclose order2mod1 failed");
return 1;
}
if (dlclose (h2) != 0)
{
puts ("dlclose order2mod2 failed");
return 1;
}
return 0;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
static void
__attribute__ ((destructor))
fini (void)
{
if (call_puts)
puts ("5");
}

8
elf/order2mod1.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
static void
__attribute__ ((destructor))
fini (void)
{
putchar ('1');
}

18
elf/order2mod2.c Normal file
View File

@ -0,0 +1,18 @@
#include <stdio.h>
extern int foo (void);
extern int bar (void);
void
__attribute__ ((constructor))
init (void)
{
foo () - bar ();
}
static void
__attribute__ ((destructor))
fini (void)
{
putchar ('2');
}

14
elf/order2mod3.c Normal file
View File

@ -0,0 +1,14 @@
#include <stdio.h>
int
bar (void)
{
return 1;
}
static void
__attribute__ ((destructor))
fini (void)
{
putchar ('4');
}

16
elf/order2mod4.c Normal file
View File

@ -0,0 +1,16 @@
#include <stdio.h>
extern int bar (void);
int
foo (void)
{
return 42 + bar ();
}
static void
__attribute__ ((destructor))
fini (void)
{
putchar ('3');
}