Skip site navigation (1)Skip section navigation (2)
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>