diff options
author | David Dgien <dgienda125@gmail.com> | 2020-06-29 20:38:34 -0400 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-07-01 07:21:25 +0200 |
commit | 6d42f894eaacd9e00f061d5918f9f58f8be8164e (patch) | |
tree | 370333118aeaaca460890f8cf79650e11b7e5e10 | |
parent | c788931fb16f136c2e09e59022dabb242d4d3ba3 (diff) | |
download | barebox-6d42f894eaacd9e00f061d5918f9f58f8be8164e.tar.gz barebox-6d42f894eaacd9e00f061d5918f9f58f8be8164e.tar.xz |
module: Fix module command registration
Commit 1e4a948673d7 ("command: Use array of pointers to commands")
updated the command linker sections to contain an array of pointers to
the command structs, rather than the command structs themselves.
However, the load_module function was not updated to account for the
change to the linker section, so fix that here.
Additionally, commit 22bdecc9c591 ("lds: Move start/end address
variables into defines") moved the _start and _end symbols out of the
linker script and into the section macro defines, causing them to show
up in the module symbol table as well, so we take can advantage of those
to find the array of pointers.
Fixes: 1e4a948673d7 ("command: Use array of pointers to commands")
Signed-off-by: David Dgien <dgienda125@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | common/module.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/common/module.c b/common/module.c index 5ace544e07..b08df11999 100644 --- a/common/module.c +++ b/common/module.c @@ -176,6 +176,34 @@ static void layout_sections( struct module *mod, debug("core_size: %ld\n", mod->core_size); } +static void register_module_cmds(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex) +{ + Elf32_Sym *sym; + unsigned int numsyms; + unsigned int i; + struct command * const *cmd_start = NULL; + struct command * const *cmd_end = NULL; + struct command * const *cmd; + + numsyms = sechdrs[symindex].sh_size / sizeof(Elf32_Sym); + sym = (void *)sechdrs[symindex].sh_addr; + + for (i = 0; i < numsyms; i++) { + if (strcmp(strtab + sym[i].st_name, MODULE_SYMBOL_PREFIX "__barebox_cmd_start") == 0) + cmd_start = (struct command * const *)sym[i].st_value; + + if (strcmp(strtab + sym[i].st_name, MODULE_SYMBOL_PREFIX "__barebox_cmd_end") == 0) + cmd_end = (struct command * const *)sym[i].st_value; + } + + if (cmd_start && cmd_end) { + debug("found __barebox_cmd_start at 0x%08x\n", (uint32_t)cmd_start); + for (cmd = cmd_start; cmd != cmd_end; cmd++) { + register_command(*cmd); + } + } +} + LIST_HEAD(module_list); struct module * load_module(void *mod_image, unsigned long len) @@ -183,8 +211,6 @@ struct module * load_module(void *mod_image, unsigned long len) struct module *module = NULL; Elf32_Ehdr *ehdr; /* Elf header structure pointer */ Elf32_Shdr *sechdrs; /* Section header structure pointer */ - Elf32_Sym *sym; - unsigned int numsyms; char *strtab = 0; /* String table pointer */ int i; /* Loop counter */ unsigned int strindex = 0; @@ -193,7 +219,6 @@ struct module * load_module(void *mod_image, unsigned long len) char *secstrings; void *ptr = NULL; int err; - int cmdindex; if (len < sizeof(*ehdr)) return NULL; @@ -285,17 +310,7 @@ struct module * load_module(void *mod_image, unsigned long len) apply_relocate_add(sechdrs, strtab, symindex, i, module); } - numsyms = sechdrs[symindex].sh_size / sizeof(Elf32_Sym); - sym = (void *)sechdrs[symindex].sh_addr; - - cmdindex = find_sec(ehdr, sechdrs, secstrings, ".barebox_cmd"); - if (cmdindex) { - struct command *cmd =(struct command *)sechdrs[cmdindex].sh_addr; - for (i = 0; i < sechdrs[cmdindex].sh_size / sizeof(struct command); i++) { - register_command(cmd); - cmd++; - } - } + register_module_cmds(sechdrs, strtab, symindex); /* Module has been moved */ module = (void *)sechdrs[modindex].sh_addr; |