llext: look for symbols in other LLEXT objects too
LLEXT objects can also export symbols for use by other such objects. That means, that when linking an LLEXT object we have to look for unresolved symbols in previously loaded objects too. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
This commit is contained in:
parent
19ccec6a03
commit
fe609dd8e8
1 changed files with 31 additions and 0 deletions
|
|
@ -52,6 +52,33 @@ static size_t llext_file_offset(struct llext_loader *ldr, size_t offset)
|
|||
return offset;
|
||||
}
|
||||
|
||||
struct llext_extension_sym {
|
||||
const char *sym;
|
||||
const void *addr;
|
||||
};
|
||||
|
||||
static int llext_find_extension_sym_iterate(struct llext *ext, void *arg)
|
||||
{
|
||||
struct llext_extension_sym *se = arg;
|
||||
const void *addr = llext_find_sym(&ext->exp_tab, se->sym);
|
||||
|
||||
if (addr) {
|
||||
se->addr = addr;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const void *llext_find_extension_sym(const char *sym_name)
|
||||
{
|
||||
struct llext_extension_sym se = {.sym = sym_name};
|
||||
|
||||
llext_iterate(llext_find_extension_sym_iterate, &se);
|
||||
|
||||
return se.addr;
|
||||
}
|
||||
|
||||
static void llext_link_plt(struct llext_loader *ldr, struct llext *ext,
|
||||
elf_shdr_t *shdr, bool do_local, elf_shdr_t *tgt)
|
||||
{
|
||||
|
|
@ -148,6 +175,10 @@ static void llext_link_plt(struct llext_loader *ldr, struct llext *ext,
|
|||
link_addr = llext_find_sym(&ext->sym_tab, name);
|
||||
}
|
||||
|
||||
if (!link_addr) {
|
||||
link_addr = llext_find_extension_sym(name);
|
||||
}
|
||||
|
||||
if (!link_addr) {
|
||||
LOG_WRN("PLT: cannot find idx %u name %s", j, name);
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Reference in a new issue