Skip to content

Commit fe609dd

Browse files
lyakhnashif
authored andcommitted
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 <[email protected]>
1 parent 19ccec6 commit fe609dd

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

subsys/llext/llext_link.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,33 @@ static size_t llext_file_offset(struct llext_loader *ldr, size_t offset)
5252
return offset;
5353
}
5454

55+
struct llext_extension_sym {
56+
const char *sym;
57+
const void *addr;
58+
};
59+
60+
static int llext_find_extension_sym_iterate(struct llext *ext, void *arg)
61+
{
62+
struct llext_extension_sym *se = arg;
63+
const void *addr = llext_find_sym(&ext->exp_tab, se->sym);
64+
65+
if (addr) {
66+
se->addr = addr;
67+
return 1;
68+
}
69+
70+
return 0;
71+
}
72+
73+
static const void *llext_find_extension_sym(const char *sym_name)
74+
{
75+
struct llext_extension_sym se = {.sym = sym_name};
76+
77+
llext_iterate(llext_find_extension_sym_iterate, &se);
78+
79+
return se.addr;
80+
}
81+
5582
static void llext_link_plt(struct llext_loader *ldr, struct llext *ext,
5683
elf_shdr_t *shdr, bool do_local, elf_shdr_t *tgt)
5784
{
@@ -148,6 +175,10 @@ static void llext_link_plt(struct llext_loader *ldr, struct llext *ext,
148175
link_addr = llext_find_sym(&ext->sym_tab, name);
149176
}
150177

178+
if (!link_addr) {
179+
link_addr = llext_find_extension_sym(name);
180+
}
181+
151182
if (!link_addr) {
152183
LOG_WRN("PLT: cannot find idx %u name %s", j, name);
153184
continue;

0 commit comments

Comments
 (0)