From 9bd9c03e9216324dd9dfcda9145702c561b4abb8 Mon Sep 17 00:00:00 2001 From: jb Date: Sun, 18 Nov 2007 00:23:31 +0000 Subject: 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. --- sys/kern/kern_linker.c | 10 ++++++++++ sys/kern/linker_if.m | 11 +++++++++++ sys/sys/linker.h | 8 ++++++++ 3 files changed, 29 insertions(+) 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); -- cgit v1.1