From c0d6f2a33e1229a96d5d5064b9b04d7d3cd41d9d Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 10 Nov 2015 19:44:48 -0800 Subject: NaCl: Use open_resource API for shared objects --- sysdeps/nacl/dl-sysdep-open.h | 40 ++++++++++++++++++++++++++++++++++++++ sysdeps/nacl/dl-sysdep.c | 23 ++++++++++++++++++++++ sysdeps/nacl/nacl-interface-list.h | 2 +- 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 sysdeps/nacl/dl-sysdep-open.h (limited to 'sysdeps/nacl') diff --git a/sysdeps/nacl/dl-sysdep-open.h b/sysdeps/nacl/dl-sysdep-open.h new file mode 100644 index 0000000000..38b0f9e86d --- /dev/null +++ b/sysdeps/nacl/dl-sysdep-open.h @@ -0,0 +1,40 @@ +/* System-specific call to open a shared object by name. NaCl version. + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _DL_SYSDEP_OPEN_H +#define _DL_SYSDEP_OPEN_H 1 + +#include + +/* NAME is a name without slashes, as it appears in a DT_NEEDED entry + or a dlopen call's argument or suchlike. NAMELEN is (strlen (NAME) + 1). + + Find NAME in an OS-dependent fashion, and return its "real" name. + Optionally fill in *FD with a file descriptor open on that file (or + else leave its initial value of -1). The return value is a new + malloc'd string, which will be free'd by the caller. If NAME is + resolved to an actual file that can be opened, then the return + value should name that file (and if *FD was not set, then a normal + __open call on that string will be made). If *FD was set by some + other means than a normal open and there is no "real" name to use, + then __strdup (NAME) is fine (modulo error checking). */ + +extern char *_dl_sysdep_open_object (const char *name, size_t namelen, int *fd) + internal_function attribute_hidden; + +#endif /* dl-sysdep-open.h */ diff --git a/sysdeps/nacl/dl-sysdep.c b/sysdeps/nacl/dl-sysdep.c index 3e902c2cae..3a04aa1176 100644 --- a/sysdeps/nacl/dl-sysdep.c +++ b/sysdeps/nacl/dl-sysdep.c @@ -87,3 +87,26 @@ _dl_start_user (void (*user_entry) (uint32_t info[]), uint32_t info[]) #endif /* SHARED */ #include + +#include +#include +#include +#include +#include + +char * +internal_function +_dl_sysdep_open_object (const char *name, size_t namelen, int *fd) +{ + int error = __nacl_irt_resource_open.open_resource (name, fd); + if (error) + return NULL; + assert (*fd != -1); + char *realname = __strdup (name); + if (__glibc_unlikely (realname == NULL)) + { + __close (*fd); + *fd = -1; + } + return realname; +} diff --git a/sysdeps/nacl/nacl-interface-list.h b/sysdeps/nacl/nacl-interface-list.h index cb337510fc..c68faedc54 100644 --- a/sysdeps/nacl/nacl-interface-list.h +++ b/sysdeps/nacl/nacl-interface-list.h @@ -28,7 +28,7 @@ NACL_MANDATORY_INTERFACE (rtld, NACL_IRT_FUTEX_v0_1, nacl_irt_futex) NACL_MANDATORY_INTERFACE (rtld, NACL_IRT_TLS_v0_1, nacl_irt_tls) -NACL_MANDATORY_INTERFACE (libc, +NACL_MANDATORY_INTERFACE (rtld, NACL_IRT_RESOURCE_OPEN_v0_1, nacl_irt_resource_open) NACL_MANDATORY_INTERFACE (rtld, NACL_IRT_CODE_DATA_ALLOC_v0_1, -- cgit 1.4.1