mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 02:03:35 +08:00
1fc074913b
2004-09-23 Ulrich Drepper <drepper@redhat.com> * sysdeps/generic/bits/dlfcn.h: Add RTLD_DEEPBIND. * elf/dl-object.c (_dl_new_object): Add new parameter mode. If mode has RTLD_DEEPBIND set add local searchlist before global scope. * sysdeps/generic/ldsodefs.h (_dl_new_object): Adjust prototype. * elf/rtld.c: Adjust callers of _dl_new_object. * elf/dl-load.c: Likewise. (_dl_map_object_from_fd): If RTLD_DEEPBIND is used, don't do anything for DF_SYMBOLIC. * elf/dl-open.c (dl_open_writer): Pass RTLD_DEEPBIND flag on to _dl_map_object_deps. * elf/tst-deep1.c: New file. * elf/tst-deep1mod1.c: New file. * elf/tst-deep1mod2.c: New file. * elf/tst-deep1mod3.c: New file. * elf/Makefile: Add rules to build and run new tests. * elf/dl-deps.c: Pretty printing.
37 lines
517 B
C
37 lines
517 B
C
#include <dlfcn.h>
|
|
#include <stdio.h>
|
|
|
|
int
|
|
xyzzy (void)
|
|
{
|
|
printf ("%s:%s\n", __FILE__, __func__);
|
|
return 21;
|
|
}
|
|
|
|
int
|
|
back (void)
|
|
{
|
|
printf ("%s:%s\n", __FILE__, __func__);
|
|
return 1;
|
|
}
|
|
|
|
extern int foo (void);
|
|
|
|
static int
|
|
do_test (void)
|
|
{
|
|
void *p = dlopen ("$ORIGIN/tst-deep1mod2.so", RTLD_LAZY|RTLD_DEEPBIND);
|
|
|
|
int (*f) (void) = dlsym (p, "bar");
|
|
if (f == NULL)
|
|
{
|
|
puts (dlerror ());
|
|
return 1;
|
|
}
|
|
|
|
return foo () + f ();
|
|
}
|
|
|
|
#define TEST_FUNCTION do_test ()
|
|
#include "../test-skeleton.c"
|