diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 6 | ||||
-rw-r--r-- | elf/dl-iteratephdr.c | 32 |
2 files changed, 34 insertions, 4 deletions
diff --git a/elf/Makefile b/elf/Makefile index 2e6b6cb2b2..ead590bdc1 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -22,7 +22,7 @@ subdir := elf headers = elf.h bits/elfclass.h link.h routines = $(dl-routines) dl-open dl-close dl-support dl-iteratephdr \ - dl-iteratephdr-static dl-addr enbl-secure dl-profstub \ + dl-addr enbl-secure dl-profstub \ dl-origin dl-libc dl-sym dl-tsd # The core dynamic linking functions are in libc for the static and @@ -33,8 +33,7 @@ dl-routines = $(addprefix dl-,load cache lookup object reloc deps \ execstack) all-dl-routines = $(dl-routines) $(sysdep-dl-routines) # But they are absent from the shared libc, because that code is in ld.so. -elide-routines.os = $(all-dl-routines) dl-support enbl-secure \ - dl-iteratephdr-static dl-origin +elide-routines.os = $(all-dl-routines) dl-support enbl-secure dl-origin # ld.so uses those routines, plus some special stuff for being the program # interpreter and operating independent of libc. @@ -87,7 +86,6 @@ distribute := rtld-Rules \ CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-dl-iterate-phdr.c = $(uses-callbacks) -CFLAGS-dl-iterate-phdr-static.c = $(uses-callbacks) include ../Makeconfig diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c index d4feb690c3..fd45f8529f 100644 --- a/elf/dl-iteratephdr.c +++ b/elf/dl-iteratephdr.c @@ -29,6 +29,7 @@ cancel_handler (void *arg __attribute__((unused))) __rtld_lock_unlock_recursive (GL(dl_load_lock)); } +hidden_proto (__dl_iterate_phdr) int __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, size_t size, void *data), void *data) @@ -58,7 +59,38 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, return ret; } +hidden_def (__dl_iterate_phdr) #ifdef SHARED + weak_alias (__dl_iterate_phdr, dl_iterate_phdr); + +#else + +/* dl-support.c defines these and initializes them early on. */ +extern ElfW(Phdr) *_dl_phdr; +extern size_t _dl_phnum; + +int +dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, + size_t size, void *data), void *data) +{ + if (_dl_phnum != 0) + { + /* This entry describes this statically-linked program itself. */ + struct dl_phdr_info info; + int ret; + info.dlpi_addr = 0; + info.dlpi_name = ""; + info.dlpi_phdr = _dl_phdr; + info.dlpi_phnum = _dl_phnum; + ret = (*callback) (&info, sizeof (struct dl_phdr_info), data); + if (ret) + return ret; + } + + return __dl_iterate_phdr (callback, data); +} + + #endif |