xref: /optee_os/ldelf/dl.c (revision c88ba1258463bfa946499d2caa9341115b2fa849)
1ebef121cSJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2ebef121cSJerome Forissier /*
3ebef121cSJerome Forissier  * Copyright (c) 2019, Linaro Limited
4ebef121cSJerome Forissier  */
5ebef121cSJerome Forissier #include <ldelf.h>
6ebef121cSJerome Forissier #include <string.h>
7ebef121cSJerome Forissier 
8ebef121cSJerome Forissier #include "dl.h"
9ebef121cSJerome Forissier #include "ta_elf.h"
10ebef121cSJerome Forissier 
dlopen_entry(struct dl_entry_arg * arg)11ebef121cSJerome Forissier TEE_Result dlopen_entry(struct dl_entry_arg *arg)
12ebef121cSJerome Forissier {
13ebef121cSJerome Forissier 	TEE_UUID zero = { };
14ebef121cSJerome Forissier 
15ebef121cSJerome Forissier 	if (arg->dlopen.flags != (RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE))
16ebef121cSJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
17ebef121cSJerome Forissier 
18ebef121cSJerome Forissier 	if (!memcmp(&arg->dlopen.uuid, &zero, sizeof(zero)))
19ebef121cSJerome Forissier 		return TEE_SUCCESS;
20ebef121cSJerome Forissier 
21ebef121cSJerome Forissier 	return ta_elf_add_library(&arg->dlopen.uuid);
22ebef121cSJerome Forissier }
23ebef121cSJerome Forissier 
dlsym_entry(struct dl_entry_arg * arg)24ebef121cSJerome Forissier TEE_Result dlsym_entry(struct dl_entry_arg *arg)
25ebef121cSJerome Forissier {
26ebef121cSJerome Forissier 	struct ta_elf *elf = NULL;
27ebef121cSJerome Forissier 	TEE_UUID zero = { };
28ebef121cSJerome Forissier 
29ebef121cSJerome Forissier 	if (memcmp(&arg->dlsym.uuid, &zero, sizeof(zero))) {
30ebef121cSJerome Forissier 		elf = ta_elf_find_elf(&arg->dlsym.uuid);
31ebef121cSJerome Forissier 		if (!elf)
32ebef121cSJerome Forissier 			return TEE_ERROR_ITEM_NOT_FOUND;
33ebef121cSJerome Forissier 	}
34ebef121cSJerome Forissier 
35*c88ba125SJerome Forissier 	return ta_elf_resolve_sym(arg->dlsym.symbol, &arg->dlsym.val, NULL,
36*c88ba125SJerome Forissier 				  elf);
37ebef121cSJerome Forissier }
38ebef121cSJerome Forissier 
39