From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2856 invoked by alias); 18 Mar 2004 14:53:42 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 2838 invoked from network); 18 Mar 2004 14:53:41 -0000 Received: from unknown (HELO sunsite.ms.mff.cuni.cz) (195.113.15.26) by sources.redhat.com with SMTP; 18 Mar 2004 14:53:41 -0000 Received: from sunsite.ms.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8) with ESMTP id i2ICiBGc006586; Thu, 18 Mar 2004 13:44:11 +0100 Received: (from jakub@localhost) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8/Submit) id i2ICiBZ0006584; Thu, 18 Mar 2004 13:44:11 +0100 Date: Thu, 18 Mar 2004 14:53:00 -0000 From: Jakub Jelinek To: Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] Fix hwcap handling in ld.so Message-ID: <20040318124411.GE6393@sunsite.ms.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-SW-Source: 2004-03/txt/msg00096.txt.bz2 Hi! Wonder why this has been broken for so long unnoticed. unsigned long long x, y; ... (x & y) > x is 0 for any x, y. Guess I should add a GCC warning for this kind of things. I believe the following patch is correct and seems to work for me on both PIII (where it doesn't decide to use a /usr/lib/sse2/ library neither without nor with LD_LIBRARY_PATH=/usr/lib, without this patch it happily uses /usr/lib/sse2/ library without LD_LIBRARY_PATH=/usr/lib, but doesn't use it with the env var) and on x86-64 (where it uses /usr/lib/sse2/). When GLRO(dl_osversion) is referenced in dl-cache.c, I don't see how GLRO(dl_hwcap) could be undefined, since it is for statically linked apps defined in dl-support.c together with _dl_osversion. 2004-03-18 Jakub Jelinek * sysdeps/generic/dl-cache.c (_dl_load_cache_lookup): Remove hwcap variable and weak_extern for _dl_hwcap. (_DL_HWCAP_TLS_MASK): Define. (HWCAP_CHECK): Fix checking of non-platform hwcap bits. Use lib->osversion instead of cache_new->libs[middle].osversion. --- libc/sysdeps/generic/dl-cache.c.jj 2004-03-08 12:01:51.000000000 +0100 +++ libc/sysdeps/generic/dl-cache.c 2004-03-18 14:55:34.774381649 +0100 @@ -243,12 +243,7 @@ _dl_load_cache_lookup (const char *name) if (cache_new != (void *) -1) { - /* This file ends in static libraries where we don't have a hwcap. */ - unsigned long int *hwcap; uint64_t platform; -#ifndef SHARED - weak_extern (_dl_hwcap); -#endif /* This is where the strings start. */ cache_data = (const char *) cache_new; @@ -256,22 +251,25 @@ _dl_load_cache_lookup (const char *name) /* Now we can compute how large the string table is. */ cache_data_size = (const char *) cache + cachesize - cache_data; - hwcap = &GLRO(dl_hwcap); platform = _dl_string_platform (GLRO(dl_platform)); if (platform != (uint64_t) -1) platform = 1ULL << platform; /* Only accept hwcap if it's for the right platform. */ +#ifdef USE_TLS +# define _DL_HWCAP_TLS_MASK (1LL << 63) +#else +# define _DL_HWCAP_TLS_MASK 0 +#endif #define HWCAP_CHECK \ - if (GLRO(dl_osversion) \ - && cache_new->libs[middle].osversion > GLRO(dl_osversion)) \ + if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) \ continue; \ if (_DL_PLATFORMS_COUNT && platform != -1 \ && (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \ && (lib->hwcap & _DL_HWCAP_PLATFORM) != platform) \ continue; \ - if (hwcap \ - && ((lib->hwcap & *hwcap & ~_DL_HWCAP_PLATFORM) > *hwcap)) \ + if (lib->hwcap \ + & ~(GLRO(dl_hwcap) | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK)) \ continue SEARCH_CACHE (cache_new); } Jakub