summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjb <jb@FreeBSD.org>2007-11-18 00:23:31 +0000
committerjb <jb@FreeBSD.org>2007-11-18 00:23:31 +0000
commit9bd9c03e9216324dd9dfcda9145702c561b4abb8 (patch)
tree55bd23df13e645c28c563525f2433dd5ff2447ea
parent804a2cd23889a22a7ab5641fcfe31330a66f154e (diff)
downloadFreeBSD-src-9bd9c03e9216324dd9dfcda9145702c561b4abb8.zip
FreeBSD-src-9bd9c03e9216324dd9dfcda9145702c561b4abb8.tar.gz
Add a function to list symbols in a file and their values at the
same time rather than having to list the symbols and then go back and look each one up by name.
-rw-r--r--sys/kern/kern_linker.c10
-rw-r--r--sys/kern/linker_if.m11
-rw-r--r--sys/sys/linker.h8
3 files changed, 29 insertions, 0 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index e6080aa..321436d 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -690,6 +690,16 @@ linker_file_lookup_set(linker_file_t file, const char *name,
return (error);
}
+/*
+ * List all functions in a file.
+ */
+int
+linker_file_function_listall(linker_file_t lf,
+ int (*callback_func)(linker_file_t, linker_symval_t *, void *), void *arg)
+{
+ return (LINKER_EACH_FUNCTION_NAMEVAL(lf, callback_func, arg));
+}
+
caddr_t
linker_file_lookup_symbol(linker_file_t file, const char *name, int deps)
{
diff --git a/sys/kern/linker_if.m b/sys/kern/linker_if.m
index 84d56d2..1530da2 100644
--- a/sys/kern/linker_if.m
+++ b/sys/kern/linker_if.m
@@ -64,6 +64,17 @@ METHOD int each_function_name {
};
#
+# 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.
diff --git a/sys/sys/linker.h b/sys/sys/linker.h
index 83774e6..f9ce2a4 100644
--- a/sys/sys/linker.h
+++ b/sys/sys/linker.h
@@ -59,6 +59,8 @@ typedef struct linker_symval {
size_t size;
} linker_symval_t;
+typedef int (*linker_function_nameval_callback_t)(linker_file_t, linker_symval_t *, void *);
+
struct common_symbol {
STAILQ_ENTRY(common_symbol) link;
char* name;
@@ -154,6 +156,12 @@ int linker_file_lookup_set(linker_file_t _file, const char *_name,
void *_start, void *_stop, int *_count);
/*
+ * List all functions in a file.
+ */
+int linker_file_function_listall(linker_file_t, int (*)(linker_file_t,
+ linker_symval_t *, void *), void *);
+
+/*
* Functions soley for use by the linker class handlers.
*/
int linker_add_class(linker_class_t _cls);
OpenPOWER on IntegriCloud