mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
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.cvs/glibc-2_3-branch
14 changed files with 142 additions and 20 deletions
@ -0,0 +1,36 @@ |
|||
#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" |
|||
@ -0,0 +1,14 @@ |
|||
#include <stdio.h> |
|||
int |
|||
foo (void) |
|||
{ |
|||
printf ("%s:%s\n", __FILE__, __func__); |
|||
return 1; |
|||
} |
|||
|
|||
int |
|||
baz (void) |
|||
{ |
|||
printf ("%s:%s\n", __FILE__, __func__); |
|||
return 20; |
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
#include <stdio.h> |
|||
extern int baz (void); |
|||
extern int xyzzy (void); |
|||
int |
|||
bar (void) |
|||
{ |
|||
printf ("%s:%s\n", __FILE__, __func__); |
|||
return baz () + xyzzy ();; |
|||
} |
|||
|
|||
int |
|||
back (void) |
|||
{ |
|||
printf ("%s:%s\n", __FILE__, __func__); |
|||
return -1; |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
#include <stdio.h> |
|||
|
|||
extern int back (void); |
|||
|
|||
int |
|||
baz (void) |
|||
{ |
|||
printf ("%s:%s\n", __FILE__, __func__); |
|||
return back (); |
|||
} |
|||
|
|||
int |
|||
xyzzy (void) |
|||
{ |
|||
printf ("%s:%s\n", __FILE__, __func__); |
|||
return 0; |
|||
} |
|||
Loading…
Reference in new issue