Skip to content

Commit 96852bc

Browse files
lyakhnashif
authored andcommitted
llext: add a test for inter-extension linking
This test uses two LLEXT objects: one of them exports a symbol and the other one calls the exported function. Signed-off-by: Guennadi Liakhovetski <[email protected]>
1 parent 697c5fd commit 96852bc

File tree

4 files changed

+88
-1
lines changed

4 files changed

+88
-1
lines changed

tests/subsys/llext/simple/CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,16 @@ target_include_directories(app PRIVATE
1515
${ZEPHYR_BASE}/arch/${ARCH}/include
1616
)
1717

18-
set(ext_names hello_world logging relative_jump object syscalls threads_kernel_objects)
18+
set(ext_names
19+
hello_world
20+
logging
21+
relative_jump
22+
object
23+
syscalls
24+
threads_kernel_objects
25+
export_dependent
26+
export_dependency
27+
)
1928

2029
if(CONFIG_ARM)
2130
if(NOT CONFIG_CPU_CORTEX_M0 AND NOT CONFIG_CPU_CORTEX_M0PLUS AND NOT CONFIG_CPU_CORTEX_M1)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright (c) 2024 Intel Corporation.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/* Test exporting symbols, imported by other LLEXTs */
8+
9+
#include <zephyr/llext/symbol.h>
10+
11+
long test_dependency(int a, int b)
12+
{
13+
return (long)a * b;
14+
}
15+
EXPORT_SYMBOL(test_dependency);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright (c) 2024 Intel Corporation.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/* Test importing symbols, exported by other LLEXTs */
8+
9+
#include <zephyr/ztest.h>
10+
#include <zephyr/llext/symbol.h>
11+
#include <zephyr/sys/util.h>
12+
13+
extern long test_dependency(int a, int b);
14+
15+
void test_entry(void)
16+
{
17+
unsigned long half_ptr_bits = sizeof(uintptr_t) * 8 / 2;
18+
unsigned long mask = BIT(half_ptr_bits) - 1;
19+
int a = mask & (uintptr_t)test_entry;
20+
int b = mask & ((uintptr_t)test_entry >> half_ptr_bits);
21+
22+
zassert_equal(test_dependency(a, b), (long)a * b);
23+
}
24+
EXPORT_SYMBOL(test_entry);

tests/subsys/llext/simple/src/test_llext_simple.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,45 @@ static LLEXT_CONST uint8_t multi_file_ext[] ELF_ALIGN = {
320320
LLEXT_LOAD_UNLOAD(multi_file)
321321
#endif
322322

323+
#ifndef CONFIG_USERSPACE
324+
static LLEXT_CONST uint8_t export_dependent_ext[] ELF_ALIGN = {
325+
#include "export_dependent.inc"
326+
};
327+
328+
static LLEXT_CONST uint8_t export_dependency_ext[] ELF_ALIGN = {
329+
#include "export_dependency.inc"
330+
};
331+
332+
ZTEST(llext, test_inter_ext)
333+
{
334+
const void *dependency_buf = export_dependency_ext;
335+
const void *dependent_buf = export_dependent_ext;
336+
struct llext_buf_loader buf_loader_dependency =
337+
LLEXT_BUF_LOADER(dependency_buf, sizeof(hello_world_ext));
338+
struct llext_buf_loader buf_loader_dependent =
339+
LLEXT_BUF_LOADER(dependent_buf, sizeof(export_dependent_ext));
340+
struct llext_loader *loader_dependency = &buf_loader_dependency.loader;
341+
struct llext_loader *loader_dependent = &buf_loader_dependent.loader;
342+
const struct llext_load_param ldr_parm = LLEXT_LOAD_PARAM_DEFAULT;
343+
struct llext *ext_dependency = NULL, *ext_dependent = NULL;
344+
int ret = llext_load(loader_dependency, "inter_ext_dependency", &ext_dependency, &ldr_parm);
345+
346+
zassert_ok(ret, "dependency load should succeed");
347+
348+
ret = llext_load(loader_dependent, "export_dependent", &ext_dependent, &ldr_parm);
349+
350+
zassert_ok(ret, "dependent load should succeed");
351+
352+
int (*test_entry_fn)() = llext_find_sym(&ext_dependent->exp_tab, "test_entry");
353+
354+
zassert_not_null(test_entry_fn, "test_dependent should be an exported symbol");
355+
test_entry_fn();
356+
357+
llext_unload(&ext_dependent);
358+
llext_unload(&ext_dependency);
359+
}
360+
#endif
361+
323362
#if defined(CONFIG_LLEXT_TYPE_ELF_RELOCATABLE) && defined(CONFIG_XTENSA)
324363
static LLEXT_CONST uint8_t pre_located_ext[] ELF_ALIGN = {
325364
#include "pre_located.inc"

0 commit comments

Comments
 (0)