PERFORCE change 50167 for review
Peter Wemm
peter at FreeBSD.org
Thu Apr 1 22:06:10 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=50167
Change 50167 by peter at 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
More information about the p4-projects
mailing list