[PATCH] Always set l_used for vDSO (BZ #13706)
Carlos O'Donell
carlos@systemhalted.org
Mon Feb 20 16:12:00 GMT 2012
On Mon, Feb 20, 2012 at 4:22 AM, Marek Polacek <polacek@redhat.com> wrote:
> As the PR says, ldd reports linux-vdso.so.1 as unused. The problem is that
> we weren't always setting l_used for vDSO. This path seems to fix it.
> Regtested on x86_64-linux, ok for trunk?
Can you please add a regression test for this?
The next time we break this it would be nice to have a warning.
> 2012-02-20 Marek Polacek <polacek@redhat.com>
>
> * elf/rtld.c (dl_main): Always set l_used to 1 for vDSO.
>
> --- libc/elf/rtld.c.mp 2012-02-20 10:03:06.799226404 +0100
> +++ libc/elf/rtld.c 2012-02-20 10:03:18.732248427 +0100
> @@ -1,5 +1,5 @@
> /* Run time dynamic linker.
> - Copyright (C) 1995-2010, 2011 Free Software Foundation, Inc.
> + Copyright (C) 1995-2012 Free Software Foundation, Inc.
> This file is part of the GNU C Library.
>
> The GNU C Library is free software; you can redistribute it and/or
> @@ -1375,6 +1375,9 @@ of this helper program; chances are you
> _dl_setup_hash (l);
> l->l_relocated = 1;
>
> + /* The vDSO is always used. */
> + l->l_used = 1;
> +
The call to _dl_new_object did not set l_used because DL_DEBUG_UNUSED
is in effect.
The only code that knows this is a vDSO and that it will be used
unconditionally is the code in elf/rtld.c (dl_main). Therefore this is
probably the best place to mark the vDSO as unconditionally used.
We could hack in a DT_NEEDED somewhere in the list and just allow the
normal DL_DEBUG_UNUSED checks to note that the vDSO was needed, but
that seems extremely obtuse and fragile.
Normally l_used is set during
elf/rtld/dl-lookup.c(_dl_lookup_symbol_x), but in the DL_DEBUG_UNUSED
case we never exercise that code because we aren't running the
program.
All in all your solution looks like the best option.
> /* Initialize l_local_scope to contain just this map. This allows
> the use of dl_lookup_symbol_x to resolve symbols within the vdso.
> So we create a single entry list pointing to l_real as its only
> --- libc/NEWS.mp 2012-02-20 10:02:20.037140095 +0100
> +++ libc/NEWS 2012-02-20 10:03:42.095291549 +0100
> @@ -12,7 +12,7 @@ Version 2.16
> 174, 350, 411, 3335, 4026, 4596, 4822, 5077, 5805, 5993, 6884, 6907, 9739,
> 9902, 10140, 10210, 11174, 11322, 11494, 12047, 13058, 13525, 13526,
> 13527, 13528, 13529, 13530, 13531, 13532, 13533, 13547, 13551, 13552,
> - 13553, 13555, 13559, 13583, 13618, 13704
> + 13553, 13555, 13559, 13583, 13618, 13704, 13706
>
> * ISO C11 support:
>
> Marek
This is good for trunk after you add a regression test.
Cheers,
Carlos.
More information about the Libc-alpha
mailing list