1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-05 19:35:52 +03:00
2006-06-23  Joseph Myers  <joseph@codesourcery.com>
	[BZ #2980]
	* posix/Makefile (CFLAGS-waitid.c): Add
	-fasynchronous-unwind-tables.

2006-08-02  Ulrich Drepper  <drepper@redhat.com>

	* elf/dl-addr.c (_dl_addr): If GNU-style hash tables are present,
	walk them instead of the symbol table.
This commit is contained in:
Ulrich Drepper
2006-08-02 16:45:53 +00:00
parent 5632cd2060
commit 82ee37c510
4 changed files with 69 additions and 48 deletions

View File

@@ -1,3 +1,14 @@
2006-06-23 Joseph Myers <joseph@codesourcery.com>
[BZ #2980]
* posix/Makefile (CFLAGS-waitid.c): Add
-fasynchronous-unwind-tables.
2006-08-02 Ulrich Drepper <drepper@redhat.com>
* elf/dl-addr.c (_dl_addr): If GNU-style hash tables are present,
walk them instead of the symbol table.
2006-08-01 Ulrich Drepper <drepper@redhat.com> 2006-08-01 Ulrich Drepper <drepper@redhat.com>
* nscd/initgrcache.c (addinitgroupsX): Judge successful lookups by * nscd/initgrcache.c (addinitgroupsX): Judge successful lookups by

View File

@@ -74,6 +74,40 @@ _dl_addr (const void *address, Dl_info *info,
ElfW(Word) strtabsize = match->l_info[DT_STRSZ]->d_un.d_val; ElfW(Word) strtabsize = match->l_info[DT_STRSZ]->d_un.d_val;
const ElfW(Sym) *matchsym = NULL;
if (match->l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM + DT_THISPROCNUM
+ DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM] != NULL)
{
/* We look at all symbol table entries referenced by the
hash table. */
for (Elf_Symndx bucket = 0; bucket < match->l_nbuckets; ++bucket)
{
Elf32_Word symndx = match->l_gnu_buckets[bucket];
if (bucket != 0)
{
const Elf32_Word *hasharr = &match->l_gnu_chain_zero[symndx];
do
{
/* The hash table never references local symbols
so we can omit that test here. */
if (symtab[symndx].st_shndx != SHN_UNDEF
#ifdef USE_TLS
&& ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS
#endif
&& DL_ADDR_SYM_MATCH (match, &symtab[symndx],
matchsym, addr)
&& symtab[symndx].st_name < strtabsize)
matchsym = (ElfW(Sym) *) &symtab[symndx];
++symndx;
}
while ((*hasharr++ & 1u) == 0);
}
}
}
else
{
const ElfW(Sym) *symtabend; const ElfW(Sym) *symtabend;
if (match->l_info[DT_HASH] != NULL) if (match->l_info[DT_HASH] != NULL)
symtabend = (symtab symtabend = (symtab
@@ -85,17 +119,17 @@ _dl_addr (const void *address, Dl_info *info,
the string table which generally follows the symbol table. */ the string table which generally follows the symbol table. */
symtabend = (const ElfW(Sym) *) strtab; symtabend = (const ElfW(Sym) *) strtab;
const ElfW(Sym) *matchsym; for (; (void *) symtab < (void *) symtabend; ++symtab)
for (matchsym = NULL; (void *) symtab < (void *) symtabend; ++symtab)
if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL
|| ELFW(ST_BIND) (symtab->st_info) == STB_WEAK) || ELFW(ST_BIND) (symtab->st_info) == STB_WEAK)
#if defined USE_TLS #ifdef USE_TLS
&& ELFW(ST_TYPE) (symtab->st_info) != STT_TLS && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS
#endif #endif
&& symtab->st_shndx != SHN_UNDEF && symtab->st_shndx != SHN_UNDEF
&& DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr) && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr)
&& symtab->st_name < strtabsize) && symtab->st_name < strtabsize)
matchsym = (ElfW(Sym) *) symtab; matchsym = (ElfW(Sym) *) symtab;
}
if (mapp) if (mapp)
*mapp = match; *mapp = match;

View File

@@ -1,5 +1,5 @@
/* Determine whether the host has multiple processors. Linux version. /* Determine whether the host has multiple processors. Linux version.
Copyright (C) 1996, 2002, 2004 Free Software Foundation, Inc. Copyright (C) 1996, 2002, 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -17,36 +17,12 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <sys/sysctl.h>
#include <not-cancel.h>
/* Test whether the machine has more than one processor. This is not the /* Test whether the machine has more than one processor. This is not the
best test but good enough. More complicated tests would require `malloc' best test but good enough. More complicated tests would require `malloc'
which is not available at that time. */ which is not available at that time. */
static inline int static inline int
is_smp_system (void) is_smp_system (void)
{ {
static const int sysctl_args[] = { CTL_KERN, KERN_VERSION }; /* Assume all machines are SMP and/or CMT and/or SMT. */
char buf[512]; return 1;
size_t reslen = sizeof (buf);
/* Try reading the number using `sysctl' first. */
if (__sysctl ((int *) sysctl_args,
sizeof (sysctl_args) / sizeof (sysctl_args[0]),
buf, &reslen, NULL, 0) < 0)
{
/* This was not successful. Now try reading the /proc filesystem. */
int fd = open_not_cancel_2 ("/proc/sys/kernel/version", O_RDONLY);
if (__builtin_expect (fd, 0) == -1
|| (reslen = read_not_cancel (fd, buf, sizeof (buf))) <= 0)
/* This also didn't work. We give up and say it's a UP machine. */
buf[0] = '\0';
close_not_cancel_no_status (fd);
}
return strstr (buf, "SMP") != NULL;
} }

View File

@@ -141,7 +141,7 @@ CFLAGS-pwrite.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-pwrite64.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pwrite64.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-sleep.c = -fexceptions CFLAGS-sleep.c = -fexceptions
CFLAGS-wait.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-wait.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-waitid.c = -fexceptions CFLAGS-waitid.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-waitpid.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-waitpid.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-getopt.c = -fexceptions CFLAGS-getopt.c = -fexceptions
CFLAGS-wordexp.c = -fexceptions CFLAGS-wordexp.c = -fexceptions