From 7bfa311ff51999f9e92620268e493959a2f7bfb4 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 5 Apr 2010 19:43:05 -0700 Subject: [PATCH] Obey LD_HWCAP_MASK in ld.so.cache lookups. --- ChangeLog | 4 ++++ elf/dl-cache.c | 13 ++++++++----- elf/dl-support.c | 10 +++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7485ec5429..cb02ba1e8e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2010-04-05 Roland McGrath + * elf/dl-cache.c (_dl_load_cache_lookup): Obey dl_hwcap_mask. + + * elf/dl-support.c (_dl_hwcap_mask): New variable. + * elf/rtld.c (dl_main) [HAVE_AUX_VECTOR]: Add a cast. 2010-04-05 Ulrich Drepper diff --git a/elf/dl-cache.c b/elf/dl-cache.c index bbeba77e4a..5a01c2ed1d 100644 --- a/elf/dl-cache.c +++ b/elf/dl-cache.c @@ -1,5 +1,6 @@ /* Support for reading /etc/ld.so.cache files written by Linux ldconfig. - Copyright (C) 1996-2002, 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 1996-2002,2003,2004,2006,2010 + 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 @@ -255,17 +256,19 @@ _dl_load_cache_lookup (const char *name) if (platform != (uint64_t) -1) platform = 1ULL << platform; - /* Only accept hwcap if it's for the right platform. */ #define _DL_HWCAP_TLS_MASK (1LL << 63) + uint64_t hwcap_exclude = ~((GLRO(dl_hwcap) & GLRO(dl_hwcap_mask)) + | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK); + + /* Only accept hwcap if it's for the right platform. */ #define HWCAP_CHECK \ + if (lib->hwcap & hwcap_exclude) \ + continue; \ if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) \ continue; \ if (_DL_PLATFORMS_COUNT \ && (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \ && (lib->hwcap & _DL_HWCAP_PLATFORM) != platform) \ - continue; \ - if (lib->hwcap \ - & ~(GLRO(dl_hwcap) | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK)) \ continue SEARCH_CACHE (cache_new); } diff --git a/elf/dl-support.c b/elf/dl-support.c index bcf0e2a560..65b25750de 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -1,5 +1,5 @@ /* Support for dynamic linking code in static libc. - Copyright (C) 1996-2008, 2009 Free Software Foundation, Inc. + Copyright (C) 1996-2008,2009,2010 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 @@ -126,6 +126,14 @@ ElfW(Phdr) *_dl_phdr; size_t _dl_phnum; uint64_t _dl_hwcap __attribute__ ((nocommon)); +/* This is not initialized to HWCAP_IMPORTANT, matching the definition + of _dl_important_hwcaps, below, where no hwcap strings are ever + used. This mask is still used to mediate the lookups in the cache + file. Since there is no way to set this nonzero (we don't grok the + LD_HWCAP_MASK environment variable here), there is no real point in + setting _dl_hwcap nonzero below, but we do anyway. */ +uint64_t _dl_hwcap_mask __attribute__ ((nocommon)); + /* Prevailing state of the stack, PF_X indicating it's executable. */ ElfW(Word) _dl_stack_flags = PF_R|PF_W|PF_X;