This is the mail archive of the
mailing list for the glibc project.
[PING][RFC][BZ #16046] dl_iterate_phdr should not expose internal stub.
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: libc-alpha at sourceware dot org
- Date: Mon, 21 Oct 2013 09:00:26 +0200
- Subject: [PING][RFC][BZ #16046] dl_iterate_phdr should not expose internal stub.
- Authentication-results: sourceware.org; auth=none
- References: <20131017174710 dot GA4993 at domone dot podge>
On Thu, Oct 17, 2013 at 07:47:10PM +0200, OndÅej BÃlka wrote:
> A dl_iterate_phdr has following output which was taken from bugzilla.
> Using current git trunk, dynamically linked binary shows:
> addr=(nil) name= phdr=0x400040 phnum=9
> addr=0x7fff2a613000 name=linux-vdso.so.1 phdr=0x7fff29d13040 phnum=4
> addr=0x7f73a76d4000 name=./libc.so.6 phdr=0x7f73a76d4040 phnum=10
> addr=0x7f73a7a87000 name=./elf/ld.so phdr=0x7f73a7a87040 phnum=7
> Statically linked binary:
> addr=(nil) name= phdr=0x400040 phnum=6
> addr=(nil) name= phdr=(nil) phnum=0
> addr=0x7ffffd5e1000 name=linux-vdso.so.1 phdr=0x7ffffcce1040 phnum=4
> AFAICT, this was added in commit:
> commit f91f1c0fb89056995f1c9c6a06c361efdf5139e7
> Author: Maciej W. Rozycki <firstname.lastname@example.org>
> Date: Fri Jun 28 16:20:26 2013 +0100
> [BZ #15022] Correct global-scope dlopen issues in static executables.
> This change creates a link map in static executables to serve as the
> global search list for dlopen. It fixes a problem with the inability
> to access the global symbol object and a crash on an attempt to map a
> DSO into the global scope. Some code that has become dead after the
> addition of this link map is removed too and test cases are provided.
> A fix should be easy with proper knowledge. It should look like following one,
> but I am not completely sure if it suffices to check if phdr is nonnul.
> [BZ #16046]
> * elf/dl-iteratephdr.c: Hide internal stub.
> diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c
> index 609b900..928e76c 100644
> --- a/elf/dl-iteratephdr.c
> +++ b/elf/dl-iteratephdr.c
> @@ -63,6 +63,8 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
> for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
> + if (l->l_real->l_phdr == NULL) /* Ignore static executable link map. */
> + continue;
> info.dlpi_addr = l->l_real->l_addr;
> info.dlpi_name = l->l_real->l_name;
> info.dlpi_phdr = l->l_real->l_phdr;
It's the InterNIC's fault.