From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25353 invoked by alias); 15 May 2003 15:18:13 -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 25326 invoked from network); 15 May 2003 15:18:12 -0000 Received: from unknown (HELO localhost.localdomain) (195.113.19.66) by sources.redhat.com with SMTP; 15 May 2003 15:18:12 -0000 Received: from sunsite.ms.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by localhost.localdomain (8.12.8/8.12.8) with ESMTP id h4FFHLqO018873; Thu, 15 May 2003 17:17:21 +0200 Received: (from jakub@localhost) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8/Submit) id h4FFG9kG018623; Thu, 15 May 2003 17:16:09 +0200 Date: Thu, 15 May 2003 15:18:00 -0000 From: Jakub Jelinek To: Ulrich Drepper , Roland McGrath , Jack Howarth , Franz Sirl Cc: Glibc hackers Subject: [PATCH] Fix ppc32 ld.so Message-ID: <20030515151608.GX16629@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: 2003-05/txt/msg00023.txt.bz2 Hi! This is something I cannot understand how it ever worked. If there is a reloc overflow on ppc32, _dl_reloc_overflow tries to print the name of the symbol. But unless sym is NULL (and thus errsym = refsym) resp. equal to refsym, it will print something from the refsym's strtab at index sym->st_name, ie. a random string at best, worst case segfault. To print sym's name instead of refsym's (though I don't understand why that is needed, both sym and refsym ought to always have the same symbol name, otherwise symbol lookup is broken) we'd have to pass down sym_map as well, but sym_map is not always computed (ATM only if --with-tls). 2003-05-15 Jakub Jelinek * sysdeps/powerpc/powerpc32/dl-machine.c (_dl_reloc_overflow): Remove sym argument, always use refsym. (__process_machine_rela): Adjust callers. * sysdeps/powerpc/powerpc32/dl-machine.h (_dl_reloc_overflow): Adjust prototype. --- libc/sysdeps/powerpc/powerpc32/dl-machine.c.jj 2003-04-24 13:56:31.000000000 -0400 +++ libc/sysdeps/powerpc/powerpc32/dl-machine.c 2003-05-15 10:57:20.000000000 -0400 @@ -372,22 +372,20 @@ void _dl_reloc_overflow (struct link_map *map, const char *name, Elf32_Addr *const reloc_addr, - const Elf32_Sym *sym, const Elf32_Sym *refsym) { char buffer[128]; char *t; - const Elf32_Sym *errsym = sym ?: refsym; t = stpcpy (buffer, name); t = stpcpy (t, " relocation at 0x00000000"); _itoa_word ((unsigned) reloc_addr, t, 16, 0); - if (errsym) + if (refsym) { const char *strtab; strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); t = stpcpy (t, " for symbol `"); - t = stpcpy (t, strtab + errsym->st_name); + t = stpcpy (t, strtab + refsym->st_name); t = stpcpy (t, "'"); } t = stpcpy (t, " out of range"); @@ -424,19 +422,19 @@ __process_machine_rela (struct link_map case R_PPC_ADDR24: if (__builtin_expect (finaladdr > 0x01fffffc && finaladdr < 0xfe000000, 0)) - _dl_reloc_overflow (map, "R_PPC_ADDR24", reloc_addr, sym, refsym); + _dl_reloc_overflow (map, "R_PPC_ADDR24", reloc_addr, refsym); *reloc_addr = (*reloc_addr & 0xfc000003) | (finaladdr & 0x3fffffc); break; case R_PPC_ADDR16: if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0)) - _dl_reloc_overflow (map, "R_PPC_ADDR16", reloc_addr, sym, refsym); + _dl_reloc_overflow (map, "R_PPC_ADDR16", reloc_addr, refsym); *(Elf32_Half*) reloc_addr = finaladdr; break; case R_PPC_UADDR16: if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0)) - _dl_reloc_overflow (map, "R_PPC_UADDR16", reloc_addr, sym, refsym); + _dl_reloc_overflow (map, "R_PPC_UADDR16", reloc_addr, refsym); ((char *) reloc_addr)[0] = finaladdr >> 8; ((char *) reloc_addr)[1] = finaladdr; break; @@ -457,7 +455,7 @@ __process_machine_rela (struct link_map case R_PPC_ADDR14_BRTAKEN: case R_PPC_ADDR14_BRNTAKEN: if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0)) - _dl_reloc_overflow (map, "R_PPC_ADDR14", reloc_addr, sym, refsym); + _dl_reloc_overflow (map, "R_PPC_ADDR14", reloc_addr, refsym); *reloc_addr = (*reloc_addr & 0xffff0003) | (finaladdr & 0xfffc); if (rinfo != R_PPC_ADDR14) *reloc_addr = ((*reloc_addr & 0xffdfffff) @@ -469,7 +467,7 @@ __process_machine_rela (struct link_map { Elf32_Sword delta = finaladdr - (Elf32_Word) reloc_addr; if (delta << 6 >> 6 != delta) - _dl_reloc_overflow (map, "R_PPC_REL24", reloc_addr, sym, refsym); + _dl_reloc_overflow (map, "R_PPC_REL24", reloc_addr, refsym); *reloc_addr = (*reloc_addr & 0xfc000003) | (delta & 0x3fffffc); } break; @@ -568,7 +566,7 @@ __process_machine_rela (struct link_map inline void do_reloc16 (const char *r_name, Elf32_Addr value) { if (__builtin_expect (value > 0x7fff && value < 0xffff8000, 0)) - _dl_reloc_overflow (map, r_name, reloc_addr, sym, refsym); + _dl_reloc_overflow (map, r_name, reloc_addr, refsym); *(Elf32_Half *) reloc_addr = value; } inline void do_reloc16_LO (const char *r_name, Elf32_Addr value) --- libc/sysdeps/powerpc/powerpc32/dl-machine.h.jj 2003-04-24 13:56:31.000000000 -0400 +++ libc/sysdeps/powerpc/powerpc32/dl-machine.h 2003-05-15 10:57:58.000000000 -0400 @@ -347,7 +347,6 @@ extern void __process_machine_rela (stru extern void _dl_reloc_overflow (struct link_map *map, const char *name, Elf32_Addr *const reloc_addr, - const Elf32_Sym *sym, const Elf32_Sym *refsym) attribute_hidden; /* Perform the relocation specified by RELOC and SYM (which is fully resolved). Jakub