Date: Thu, 1 Apr 2004 22:06:08 -0800 (PST) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 50167 for review Message-ID: <200404020606.i32668W4080961@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404020606.i32668W4080961>