PERFORCE change 97632 for review

John Birrell jb at FreeBSD.org
Mon May 22 20:12:17 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=97632

Change 97632 by jb at jb_freebsd2 on 2006/05/22 20:10:37

	Add a method tos list file function names and their values.

Affected files ...

.. //depot/projects/dtrace/src/sys/kern/link_elf.c#2 edit
.. //depot/projects/dtrace/src/sys/kern/link_elf_obj.c#2 edit
.. //depot/projects/dtrace/src/sys/kern/linker_if.m#2 edit

Differences ...

==== //depot/projects/dtrace/src/sys/kern/link_elf.c#2 (text+ko) ====

@@ -119,6 +119,9 @@
 static int	link_elf_each_function_name(linker_file_t,
 				int (*)(const char *, void *),
 				void *);
+static int	link_elf_each_function_nameval(linker_file_t,
+				int (*)(linker_file_t, linker_symval_t*, void *),
+				void *);
 static void	link_elf_reloc_local(linker_file_t);
 static Elf_Addr	elf_lookup(linker_file_t lf, Elf_Size symidx, int deps);
 
@@ -132,6 +135,7 @@
     KOBJMETHOD(linker_link_preload_finish, link_elf_link_preload_finish),
     KOBJMETHOD(linker_lookup_set,	link_elf_lookup_set),
     KOBJMETHOD(linker_each_function_name, link_elf_each_function_name),
+    KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval),
     { 0, 0 }
 };
 
@@ -1216,6 +1220,29 @@
     return (0);
 }
 
+static int
+link_elf_each_function_nameval(linker_file_t file,
+  int (*callback)(linker_file_t, linker_symval_t *, void *), void *opaque) {
+    linker_symval_t symval;
+    elf_file_t ef = (elf_file_t)file;
+    const Elf_Sym* symp;
+    int i, error;
+	
+    /* Exhaustive search */
+    for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
+	if (symp->st_value != 0 &&
+	    ELF_ST_TYPE(symp->st_info) == STT_FUNC) {
+		error = link_elf_symbol_values(file, (c_linker_sym_t) symp, &symval);
+		if (error)
+		    return (error);
+		error = callback(file, &symval, opaque);
+		if (error)
+		    return (error);
+	}
+    }
+    return (0);
+}
+
 #ifdef __ia64__
 /*
  * Each KLD has its own GP. The GP value for each load module is given by

==== //depot/projects/dtrace/src/sys/kern/link_elf_obj.c#2 (text+ko) ====

@@ -122,6 +122,9 @@
 		    void ***, void ***, int *);
 static int	link_elf_each_function_name(linker_file_t,
 		    int (*)(const char *, void *), void *);
+static int	link_elf_each_function_nameval(linker_file_t,
+				int (*)(linker_file_t, linker_symval_t*, void *),
+				void *);
 static void	link_elf_reloc_local(linker_file_t);
 
 static Elf_Addr elf_obj_lookup(linker_file_t lf, Elf_Size symidx, int deps);
@@ -136,6 +139,7 @@
 	KOBJMETHOD(linker_link_preload_finish,	link_elf_link_preload_finish),
 	KOBJMETHOD(linker_lookup_set,		link_elf_lookup_set),
 	KOBJMETHOD(linker_each_function_name,	link_elf_each_function_name),
+	KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval),
 	{ 0, 0 }
 };
 
@@ -1061,6 +1065,29 @@
 	return (0);
 }
 
+static int
+link_elf_each_function_nameval(linker_file_t file,
+  int (*callback)(linker_file_t, linker_symval_t *, void *), void *opaque) {
+    linker_symval_t symval;
+    elf_file_t ef = (elf_file_t)file;
+    const Elf_Sym* symp;
+    int i, error;
+	
+    /* Exhaustive search */
+    for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
+	if (symp->st_value != 0 &&
+	    ELF_ST_TYPE(symp->st_info) == STT_FUNC) {
+		error = link_elf_symbol_values(file, (c_linker_sym_t) symp, &symval);
+		if (error)
+		    return (error);
+		error = callback(file, &symval, opaque);
+		if (error)
+		    return (error);
+	}
+    }
+    return (0);
+}
+
 /*
  * Symbol lookup function that can be used when the symbol index is known (ie
  * in relocations). It uses the symbol index instead of doing a fully fledged

==== //depot/projects/dtrace/src/sys/kern/linker_if.m#2 (text+ko) ====

@@ -64,6 +64,17 @@
 };
 
 #
+# Call the callback with each specified function and it's value
+# defined in the file.
+# Stop and return the error if the callback returns an error.
+#
+METHOD int each_function_nameval {
+	linker_file_t	file;
+	linker_function_nameval_callback_t	callback;
+	void*		opaque;
+};
+
+#
 # Search for a linker set in a file.  Return a pointer to the first
 # entry (which is itself a pointer), and the number of entries.
 # "stop" points to the entry beyond the last valid entry.


More information about the p4-projects mailing list