From owner-p4-projects@FreeBSD.ORG Thu Apr 1 22:06:10 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C091116A4D0; Thu, 1 Apr 2004 22:06:09 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 93A4016A4CE for ; Thu, 1 Apr 2004 22:06:09 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7412243D3F for ; Thu, 1 Apr 2004 22:06:09 -0800 (PST) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i32669Ge080964 for ; Thu, 1 Apr 2004 22:06:09 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i32668W4080961 for perforce@freebsd.org; Thu, 1 Apr 2004 22:06:08 -0800 (PST) (envelope-from peter@freebsd.org) Date: Thu, 1 Apr 2004 22:06:08 -0800 (PST) Message-Id: <200404020606.i32668W4080961@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 50167 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Apr 2004 06:06:10 -0000 http://perforce.freebsd.org/chv.cgi?CH=50167 Change 50167 by peter@peter_hammer on 2004/04/01 22:05:31 implement *_lookup_set(). Whew, its nice to see things get smaller sometimes. Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#23 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#23 (text+ko) ==== @@ -806,62 +806,30 @@ link_elf_lookup_set(linker_file_t lf, const char *name, void ***startp, void ***stopp, int *countp) { - c_linker_sym_t sym; - linker_symval_t symval; - char *setsym; + elf_file_t ef = (elf_file_t)lf; void **start, **stop; - int len, error = 0, count; + int i, count; printf("lookup_set: name %s\n", name); - len = strlen(name) + sizeof("__start_set_"); /* sizeof includes \0 */ - setsym = malloc(len, M_LINKER, M_WAITOK); - if (setsym == NULL) - return ENOMEM; - - /* get address of first entry */ - snprintf(setsym, len, "%s%s", "__start_set_", name); - error = link_elf_lookup_symbol(lf, setsym, &sym); -printf("symbol %s result %d\n", setsym, error); - if (error) - goto out; - link_elf_symbol_values(lf, sym, &symval); -printf("value %p\n", symval.value); - if (symval.value == 0) { - error = ESRCH; - goto out; + /* Relative to section number */ + for (i = 0; i < ef->nprogtab; i++) { + if ((strncmp(ef->progtab[i].name, "set_", 4) == 0) && + strcmp(ef->progtab[i].name + 4, name) == 0) { + start = (void **)ef->progtab[i].addr; + stop = (void **)((char *)ef->progtab[i].addr + ef->progtab[i].filesz); + count = stop - start; +printf("FOUND: section %d start %p stop %p count %d\n", i, start, stop, count); + if (startp) + *startp = start; + if (stopp) + *stopp = stop; + if (countp) + *countp = count; + return (0); + } } - start = (void **)symval.value; - - /* get address of last entry */ - snprintf(setsym, len, "%s%s", "__stop_set_", name); - error = link_elf_lookup_symbol(lf, setsym, &sym); -printf("symbol %s result %d\n", setsym, error); - if (error) - goto out; - link_elf_symbol_values(lf, sym, &symval); -printf("value %p\n", symval.value); - if (symval.value == 0) { - error = ESRCH; - goto out; - } - stop = (void **)symval.value; - - /* and the number of entries */ - count = stop - start; - - /* and copy out */ - if (startp) - *startp = start; - if (stopp) - *stopp = stop; - if (countp) - *countp = count; - -printf("lookup_set: success\n"); - out: - free(setsym, M_LINKER); - return error; + return (ESRCH); } static int