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