[PATCH v1 4/4] testsuites/libtest/dl11: Add DL test for TLS

Joel Sherrill joel at rtems.org
Thu Jan 12 23:11:12 UTC 2023


Will this need to be added as an expected fail on other architectures?

Just wondering how many bsp test configuration files need touching

On Thu, Jan 12, 2023, 4:55 PM Kinsey Moore <kinsey.moore at oarcorp.com> wrote:

> This adds a test verifying basic TLS functionality in loadable modules
> now that at least one architecture supports it.
> ---
>  spec/build/testsuites/libtests/dl11.yml |  38 +++++++
>  spec/build/testsuites/libtests/grp.yml  |   2 +
>  testsuites/libtests/dl11/dl-load.c      | 142 ++++++++++++++++++++++++
>  testsuites/libtests/dl11/dl-load.h      |  33 ++++++
>  testsuites/libtests/dl11/dl11-o1.c      |  43 +++++++
>  testsuites/libtests/dl11/dl11.doc       |  44 ++++++++
>  testsuites/libtests/dl11/dl11.scn       |   6 +
>  testsuites/libtests/dl11/init.c         | 103 +++++++++++++++++
>  8 files changed, 411 insertions(+)
>  create mode 100644 spec/build/testsuites/libtests/dl11.yml
>  create mode 100644 testsuites/libtests/dl11/dl-load.c
>  create mode 100644 testsuites/libtests/dl11/dl-load.h
>  create mode 100644 testsuites/libtests/dl11/dl11-o1.c
>  create mode 100644 testsuites/libtests/dl11/dl11.doc
>  create mode 100644 testsuites/libtests/dl11/dl11.scn
>  create mode 100644 testsuites/libtests/dl11/init.c
>
> diff --git a/spec/build/testsuites/libtests/dl11.yml
> b/spec/build/testsuites/libtests/dl11.yml
> new file mode 100644
> index 0000000000..6eaaeaeecc
> --- /dev/null
> +++ b/spec/build/testsuites/libtests/dl11.yml
> @@ -0,0 +1,38 @@
> +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
> +build-type: script
> +cflags: []
> +copyrights:
> +- Copyright (C) 2023 On-Line Applications Research (OAR)
> +cppflags: []
> +do-build: |
> +  path = "testsuites/libtests/dl11/"
> +  objs = []
> +  objs.append(self.cc(bld, bic, path + "dl11-o1.c"))
> +  tar = path + "dl11.tar"
> +  self.tar(bld, objs, [path], tar)
> +  tar_c, tar_h = self.bin2c(bld, tar)
> +  objs = []
> +  objs.append(self.cc(bld, bic, tar_c))
> +  objs.append(self.cc(bld, bic, path + "init.c", deps=[tar_h],
> cppflags=bld.env.TEST_DL11_CPPFLAGS))
> +  objs.append(self.cc(bld, bic, path + "dl-load.c"))
> +  dl11_pre = path + "dl11.pre"
> +  self.link_cc(bld, bic, objs, dl11_pre)
> +  dl11_sym_o = path + "dl11-sym.o"
> +  objs.append(dl11_sym_o)
> +  self.rtems_syms(bld, dl11_pre, dl11_sym_o)
> +  self.link_cc(bld, bic, objs, "testsuites/libtests/dl11.exe")
> +do-configure: null
> +enabled-by:
> +- and:
> +  - not: TEST_DL11_EXCLUDE
> +  - BUILD_LIBDL
> +includes:
> +- testsuites/libtests/dl11
> +ldflags: []
> +links: []
> +prepare-build: null
> +prepare-configure: null
> +stlib: []
> +type: build
> +use-after: []
> +use-before: []
> diff --git a/spec/build/testsuites/libtests/grp.yml
> b/spec/build/testsuites/libtests/grp.yml
> index 9d91df75a0..8f2cadb890 100644
> --- a/spec/build/testsuites/libtests/grp.yml
> +++ b/spec/build/testsuites/libtests/grp.yml
> @@ -110,6 +110,8 @@ links:
>    uid: dl09
>  - role: build-dependency
>    uid: dl10
> +- role: build-dependency
> +  uid: dl11
>  - role: build-dependency
>    uid: dumpbuf01
>  - role: build-dependency
> diff --git a/testsuites/libtests/dl11/dl-load.c
> b/testsuites/libtests/dl11/dl-load.c
> new file mode 100644
> index 0000000000..aee1517269
> --- /dev/null
> +++ b/testsuites/libtests/dl11/dl-load.c
> @@ -0,0 +1,142 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/*
> + * Copyright (C) 2023 On-Line Applications Research Corporation (OAR).
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
> BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
> THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <errno.h>
> +#include <stdio.h>
> +
> +#include <dlfcn.h>
> +
> +#include "dl-load.h"
> +
> +#include <rtems/rtl/rtl-shell.h>
> +#include <rtems/rtl/rtl-trace.h>
> +
> +#define TEST_TRACE 0
> +#if TEST_TRACE
> + #define DEBUG_TRACE (RTEMS_RTL_TRACE_DETAIL | \
> +                      RTEMS_RTL_TRACE_WARNING | \
> +                      RTEMS_RTL_TRACE_LOAD | \
> +                      RTEMS_RTL_TRACE_UNLOAD | \
> +                      RTEMS_RTL_TRACE_SYMBOL | \
> +                      RTEMS_RTL_TRACE_RELOC | \
> +                      RTEMS_RTL_TRACE_ALLOCATOR | \
> +                      RTEMS_RTL_TRACE_UNRESOLVED | \
> +                      RTEMS_RTL_TRACE_ARCHIVES | \
> +                      RTEMS_RTL_TRACE_DEPENDENCY)
> + #define DL_DEBUG_TRACE DEBUG_TRACE /* RTEMS_RTL_TRACE_ALL */
> + #define DL_RTL_CMDS    1
> +#else
> + #define DL_DEBUG_TRACE 0
> + #define DL_RTL_CMDS    0
> +#endif
> +
> +static void dl_load_dump (void)
> +{
> +#if DL_RTL_CMDS
> +  char* list[] = { "rtl", "list", NULL };
> +  char* sym[] = { "rtl", "sym", NULL };
> +  printf ("RTL List:\n");
> +  rtems_rtl_shell_command (2, list);
> +  printf ("RTL Sym:\n");
> +  rtems_rtl_shell_command (2, sym);
> +#endif
> +}
> +
> +typedef int (*int_call_t)(void);
> +typedef int* (*ptr_call_t)(void);
> +
> +int dl_load_test(void)
> +{
> +  void*  handle;
> +  int_call_t int_call;
> +  ptr_call_t ptr_call;
> +  int    int_call_ret;
> +  int*   ptr_call_ret;
> +  int    unresolved;
> +  char*  message = "loaded";
> +
> +#if DL_DEBUG_TRACE
> +  rtems_rtl_trace_set_mask (DL_DEBUG_TRACE);
> +#endif
> +
> +  printf("load: /dl11-o1.o\n");
> +
> +  handle = dlopen ("/dl11-o1.o", RTLD_NOW | RTLD_GLOBAL);
> +  if (!handle)
> +  {
> +    printf("dlopen failed: %s\n", dlerror());
> +    return 1;
> +  }
> +
> +  if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) < 0)
> +    message = "dlinfo error checking unresolved status";
> +  else if (unresolved)
> +    message = "has unresolved externals";
> +
> +  printf ("handle: %p %s\n", handle, message);
> +
> +  dl_load_dump ();
> +
> +  ptr_call = dlsym (handle, "get_errno_ptr");
> +  if (ptr_call == NULL)
> +  {
> +    printf("dlsym failed: symbol get_errno_ptr not found\n");
> +    return 1;
> +  }
> +
> +  int_call = dlsym (handle, "get_errno_val");
> +  if (int_call == NULL)
> +  {
> +    printf("dlsym failed: symbol get_errno_val not found\n");
> +    return 1;
> +  }
> +
> +  ptr_call_ret = ptr_call ();
> +  if (ptr_call_ret != &errno)
> +  {
> +    printf("dlsym ptr_call failed: ret value bad\n");
> +    return 1;
> +  }
> +
> +  errno = 12345;
> +  int_call_ret = int_call ();
> +  if (int_call_ret != 12345)
> +  {
> +    printf("dlsym int_call failed: ret value bad\n");
> +    return 1;
> +  }
> +
> +  if (dlclose (handle) < 0)
> +  {
> +    printf("dlclose failed: %s\n", dlerror());
> +    return 1;
> +  }
> +
> +  printf ("handle: %p closed\n", handle);
> +
> +  return 0;
> +}
> diff --git a/testsuites/libtests/dl11/dl-load.h
> b/testsuites/libtests/dl11/dl-load.h
> new file mode 100644
> index 0000000000..142b195626
> --- /dev/null
> +++ b/testsuites/libtests/dl11/dl-load.h
> @@ -0,0 +1,33 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/*
> + * Copyright (c) 2014 Chris Johns <chrisj at rtems.org>.  All rights
> reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
> BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
> THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#if !defined(_DL_LOAD_H_)
> +#define _DL_LOAD_H_
> +
> +int dl_load_test(void);
> +
> +#endif
> diff --git a/testsuites/libtests/dl11/dl11-o1.c
> b/testsuites/libtests/dl11/dl11-o1.c
> new file mode 100644
> index 0000000000..e8fe0cf180
> --- /dev/null
> +++ b/testsuites/libtests/dl11/dl11-o1.c
> @@ -0,0 +1,43 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/*
> + * Copyright (C) 2023 On-Line Applications Research Corporation (OAR).
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
> BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
> THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <rtems/test-info.h>
> +#include <errno.h>
> +
> +int get_errno_val (void);
> +int *get_errno_ptr (void);
> +
> +int get_errno_val (void)
> +{
> +  return errno;
> +}
> +
> +int *get_errno_ptr (void)
> +{
> +  return &errno;
> +}
> +
> diff --git a/testsuites/libtests/dl11/dl11.doc
> b/testsuites/libtests/dl11/dl11.doc
> new file mode 100644
> index 0000000000..0fffe1cfd3
> --- /dev/null
> +++ b/testsuites/libtests/dl11/dl11.doc
> @@ -0,0 +1,44 @@
> +# SPDX-License-Identifier: BSD-2-Clause
> +
> +# Copyright (C) 2023 On-Line Applications Research Corporation (OAR).
> +#
> +# Redistribution and use in source and binary forms, with or without
> +# modification, are permitted provided that the following conditions
> +# are met:
> +# 1. Redistributions of source code must retain the above copyright
> +#    notice, this list of conditions and the following disclaimer.
> +# 2. Redistributions in binary form must reproduce the above copyright
> +#    notice, this list of conditions and the following disclaimer in the
> +#    documentation and/or other materials provided with the distribution.
> +#
> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
> IS"
> +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> THE
> +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
> THE
> +# POSSIBILITY OF SUCH DAMAGE.
> +#
> +
> +This file describes the directives and concepts tested by this test set.
> +
> +test set name: dl11
> +
> +directives:
> +
> +  dlopen
> +  dlinfo
> +  dlsym
> +  dlclose
> +
> +concepts:
> +
> ++ Load a single ELF object file.
> ++ Check there are no unreolved externals.
> ++ Locate the get_errno_val and get_errno_ptr symbols.
> ++ Call the functions that use TLS variables and verify relocated symbols.
> ++ Unload the ELF file.
> diff --git a/testsuites/libtests/dl11/dl11.scn
> b/testsuites/libtests/dl11/dl11.scn
> new file mode 100644
> index 0000000000..43048c91d2
> --- /dev/null
> +++ b/testsuites/libtests/dl11/dl11.scn
> @@ -0,0 +1,6 @@
> +*** BEGIN OF TEST libdl (RTL) 11 ***
> +load: /dl11-o1.o
> +handle: 0x40118e60 loaded
> +handle: 0x40118e60 closed
> +
> +*** END OF TEST libdl (RTL) 11 ***
> diff --git a/testsuites/libtests/dl11/init.c
> b/testsuites/libtests/dl11/init.c
> new file mode 100644
> index 0000000000..91f529b055
> --- /dev/null
> +++ b/testsuites/libtests/dl11/init.c
> @@ -0,0 +1,103 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/*
> + * Copyright (c) 2014 Chris Johns <chrisj at rtems.org>.  All rights
> reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
> BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
> THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include "tmacros.h"
> +
> +#include <errno.h>
> +#include <string.h>
> +#include <stdint.h>
> +#include <unistd.h>
> +
> +#include <rtems/rtl/rtl.h>
> +#include <rtems/imfs.h>
> +
> +#include "dl-load.h"
> +
> +const char rtems_test_name[] = "libdl (RTL) 11";
> +
> +/* forward declarations to avoid warnings */
> +static rtems_task Init(rtems_task_argument argument);
> +
> +#include "dl11-tar.h"
> +
> +#define TARFILE_START dl11_tar
> +#define TARFILE_SIZE  dl11_tar_size
> +
> +static int test(void)
> +{
> +  int ret;
> +  ret = dl_load_test();
> +  if (ret)
> +    rtems_test_exit(ret);
> +  return 0;
> +}
> +
> +static void Init(rtems_task_argument arg)
> +{
> +  int te;
> +
> +  TEST_BEGIN();
> +
> +  te = rtems_tarfs_load("/", (void *)TARFILE_START, (size_t)TARFILE_SIZE);
> +  if (te != 0)
> +  {
> +    printf("untar failed: %d\n", te);
> +    rtems_test_exit(1);
> +    exit (1);
> +  }
> +
> +  test();
> +
> +  TEST_END();
> +
> +  rtems_test_exit(0);
> +}
> +
> +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
> +
> +#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 4
> +
> +#define CONFIGURE_MAXIMUM_TASKS 1
> +
> +#define CONFIGURE_MAXIMUM_SEMAPHORES 1
> +
> +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
> +
> +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> +
> +#define CONFIGURE_INIT_TASK_STACK_SIZE (CONFIGURE_MINIMUM_TASK_STACK_SIZE
> + (4U * 1024U))
> +
> +#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
> +
> +#define CONFIGURE_INIT
> +
> +#include <rtems/confdefs.h>
> --
> 2.30.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20230112/ee594fad/attachment-0001.htm>


More information about the devel mailing list