NaCl: Implement nacl_interface_ext_supply entry point.

This commit is contained in:
Roland McGrath 2015-06-03 13:51:11 -07:00
parent cbf377edd3
commit da7f049cad
6 changed files with 107 additions and 2 deletions

View File

@ -1,3 +1,15 @@
2015-06-03 Roland McGrath <roland@hack.frob.com>
* sysdeps/nacl/nacl-interfaces.c (try_supply): New static function.
(PASTE_NAME (__nacl_supply_interface_, MODULE_NAME)): New function.
* sysdeps/nacl/nacl-interfaces.h: Declare __nacl_supply_interface_libc
and __nacl_supply_interface_rtld.
* sysdeps/nacl/nacl_interface_ext_supply.c: New file.
* sysdeps/nacl/Makefile [$(subdir) = csu] (sysdep_routines): Add it.
* sysdeps/nacl/Versions (ld: GLIBC_PRIVATE):
Add __nacl_supply_interface_rtld.
(libc: GLIBC_2.22): Add nacl_interface_ext_supply.
2015-06-03 Wilco Dijkstra <wdijkstr@arm.com> 2015-06-03 Wilco Dijkstra <wdijkstr@arm.com>
* sysdeps/ieee754/ldbl-128ibm/s_fmal.c (__fmal): Replace finite with * sysdeps/ieee754/ldbl-128ibm/s_fmal.c (__fmal): Replace finite with

View File

@ -108,7 +108,7 @@ test-wrapper-env = $(test-wrapper-env-only)
test-wrapper = $(test-wrapper-env) -- test-wrapper = $(test-wrapper-env) --
ifeq ($(subdir),csu) ifeq ($(subdir),csu)
sysdep_routines += nacl_interface_query \ sysdep_routines += nacl_interface_query nacl_interface_ext_supply \
nacl-interfaces $(call nacl-routines-of,libc) nacl-interfaces $(call nacl-routines-of,libc)
endif endif

View File

@ -1,12 +1,14 @@
ld { ld {
GLIBC_PRIVATE { GLIBC_PRIVATE {
__nacl_irt_*; __nacl_irt_*;
__nacl_supply_interface_rtld;
} }
} }
libc { libc {
GLIBC_2.22 { GLIBC_2.22 {
nacl_interface_query; nacl_interface_query;
nacl_interface_ext_supply;
} }
GLIBC_PRIVATE { GLIBC_PRIVATE {

View File

@ -121,3 +121,45 @@ __nacl_initialize_interfaces (void)
initialize_mandatory_interfaces (); initialize_mandatory_interfaces ();
initialize_optional_interfaces (); initialize_optional_interfaces ();
} }
static bool
try_supply (const struct nacl_interface *const start,
const struct nacl_interface *const stop,
uintptr_t *all_tables,
const char *ident, size_t ident_len,
const void *table, size_t tablesize)
{
const struct nacl_interface *i = start;
uintptr_t *t = all_tables;
while (i < stop)
{
if (i->table_size == tablesize
&& i->namelen == ident_len
&& !memcmp (i->name, ident, ident_len))
{
memcpy (t, table, tablesize);
return true;
}
t = next_nacl_table (t, i);
i = next_nacl_interface (i);
}
return false;
}
internal_function
bool
PASTE_NAME (__nacl_supply_interface_, MODULE_NAME)
(const char *ident, size_t ident_len, const void *table, size_t tablesize)
{
return (try_supply (__start_nacl_mandatory_interface_names,
__stop_nacl_mandatory_interface_names,
__start_nacl_mandatory_interface_tables,
ident, ident_len, table, tablesize)
|| try_supply (__start_nacl_optional_interface_names,
__stop_nacl_optional_interface_names,
__start_nacl_optional_interface_tables,
ident, ident_len, table, tablesize));
}

View File

@ -20,6 +20,7 @@
#define _NACL_INTERFACES_H 1 #define _NACL_INTERFACES_H 1
#include <errno.h> #include <errno.h>
#include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <sys/types.h> #include <sys/types.h>
@ -73,7 +74,7 @@ next_nacl_interface (const struct nacl_interface *i)
{ {
uintptr_t align = __alignof (*i); uintptr_t align = __alignof (*i);
return (const void *) (((uintptr_t) &i->name[i->namelen] + align - 1) return (const void *) (((uintptr_t) &i->name[i->namelen] + align - 1)
& -align); & -align);
} }
#if IS_IN (libpthread) #if IS_IN (libpthread)
@ -94,6 +95,12 @@ next_nacl_interface (const struct nacl_interface *i)
#undef NACL_OPTIONAL_INTERFACE #undef NACL_OPTIONAL_INTERFACE
extern void __nacl_initialize_interfaces (void) attribute_hidden; extern void __nacl_initialize_interfaces (void) attribute_hidden;
extern bool __nacl_supply_interface_libc (const char *ident, size_t ident_len,
const void *table, size_t tablesize)
internal_function attribute_hidden;
extern bool __nacl_supply_interface_rtld (const char *ident, size_t ident_len,
const void *table, size_t tablesize);
internal_function;
/* Convenience function for handling IRT call return values. */ /* Convenience function for handling IRT call return values. */
static inline int static inline int

View File

@ -0,0 +1,42 @@
/* Interface for the user to replace NaCl IRT interface functions.
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
<http://www.gnu.org/licenses/>. */
#include <nacl-interfaces.h>
#include <string.h>
size_t
nacl_interface_ext_supply (const char *interface_ident,
const void *table, size_t tablesize)
{
const size_t ident_len = strlen (interface_ident) + 1;
/* Most interfaces are in rtld, so try there first. If other
libraries ever get their own tables not used in libc, then we
will need some dynamic registration mechanism here to iterate
over all libraries' __nacl_supply_interface_libfoo calls. */
if (0
#ifdef SHARED
|| __nacl_supply_interface_rtld (interface_ident, ident_len,
table, tablesize)
#endif
|| __nacl_supply_interface_libc (interface_ident, ident_len,
table, tablesize))
return tablesize;
return 0;
}