Commit cbb6199e authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Fabio Baltieri
Browse files

LLEXT: no repeated linking with inline relocations



When linking and relocations are performed on the ELF object itself
with no copying, also global binding linking can break references.
Disable linking globally for such cases.

Signed-off-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
parent 827909b7
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -259,10 +259,7 @@ static void llext_link_plt(struct llext_loader *ldr, struct llext *ext, elf_shdr
			arch_elf_relocate_global(ldr, ext, &rela, &sym, got_offset, link_addr);
			break;
		case STB_LOCAL:
			if (ldr_parm->relocate_local) {
				arch_elf_relocate_local(ldr, ext, &rela, &sym, got_offset,
							ldr_parm);
			}
			arch_elf_relocate_local(ldr, ext, &rela, &sym, got_offset, ldr_parm);
		}

		LOG_DBG("symbol %s offset %#zx r-offset %#zx .text offset %#zx stb %u",
+7 −5
Original line number Diff line number Diff line
@@ -712,12 +712,14 @@ int do_llext_load(struct llext_loader *ldr, struct llext *ext,
		goto out;
	}

	if (ldr_parm->relocate_local) {
		LOG_DBG("Linking ELF...");
		ret = llext_link(ldr, ext, ldr_parm);
		if (ret != 0) {
			LOG_ERR("Failed to link, ret %d", ret);
			goto out;
		}
	}

	ret = llext_export_symbols(ldr, ext);
	if (ret != 0) {