diff options
author | Bart De Vries | 2022-01-17 14:10:43 +0100 |
---|---|---|
committer | Bart De Vries | 2022-01-17 14:11:46 +0100 |
commit | 703d85a1de881ed20c8916dd786351ab11536859 (patch) | |
tree | d3d74e47233d62e785ad3d17ee60adcd08ef53e2 | |
download | aur-703d85a1de881ed20c8916dd786351ab11536859.tar.gz |
Initial version
-rw-r--r-- | .SRCINFO | 57 | ||||
-rw-r--r-- | 0001-nptl_db-Support-different-libpthread-ld.so-load-orde.patch | 308 | ||||
-rw-r--r-- | 0002-nptl-Check-for-compatible-GDB-in-nptl-tst-pthread-gd.patch | 135 | ||||
-rw-r--r-- | 0003-nptl-Do-not-build-nptl-tst-pthread-gdb-attach-as-PIE.patch | 26 | ||||
-rw-r--r-- | PKGBUILD | 209 | ||||
-rw-r--r-- | bz27343.patch | 48 | ||||
-rw-r--r-- | glibc-add-support-for-SHT_RELR-sections.patch | 348 | ||||
-rw-r--r-- | glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch | 31 | ||||
-rw-r--r-- | glibc.install | 5 | ||||
-rw-r--r-- | locale-gen | 42 | ||||
-rw-r--r-- | locale.gen.txt | 23 | ||||
-rw-r--r-- | sdt-config.h | 6 | ||||
-rw-r--r-- | sdt.h | 430 |
13 files changed, 1668 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..b2015ab19b21 --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,57 @@ +pkgbase = glibc-widevine + pkgver = 2.33 + pkgrel = 5 + url = https://www.gnu.org/software/libc + arch = armv6h + arch = armv7h + arch = aarch64 + license = GPL + license = LGPL + makedepends = bison + makedepends = git + makedepends = gd + makedepends = python + optdepends = perl: for mtrace + provides = glibc=2.33 + conflicts = glibc + options = !strip + options = staticlibs + options = !distcc + source = https://ftp.gnu.org/gnu/glibc/glibc-2.33.tar.xz + source = https://ftp.gnu.org/gnu/glibc/glibc-2.33.tar.xz.sig + source = locale.gen.txt + source = locale-gen + source = sdt.h + source = sdt-config.h + source = bz27343.patch + source = 0001-nptl_db-Support-different-libpthread-ld.so-load-orde.patch + source = 0002-nptl-Check-for-compatible-GDB-in-nptl-tst-pthread-gd.patch + source = 0003-nptl-Do-not-build-nptl-tst-pthread-gdb-attach-as-PIE.patch + source = glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch + source = glibc-add-support-for-SHT_RELR-sections.patch + validpgpkeys = 7273542B39962DF7B299931416792B4EA25340F8 + validpgpkeys = BC7C7372637EC10C57D7AA6579C43DFBF1CF2187 + validpgpkeys = 16792B4EA25340F8 + md5sums = 390bbd889c7e8e8a7041564cb6b27cca + md5sums = SKIP + md5sums = 07ac979b6ab5eeb778d55f041529d623 + md5sums = 476e9113489f93b348b21e144b6a8fcf + md5sums = 91fec3b7e75510ae2ac42533aa2e695e + md5sums = 680df504c683640b02ed4a805797c0b2 + md5sums = cfe57018d06bf748b8ca1779980fef33 + md5sums = 78f041fc66fee4ee372f13b00a99ff72 + md5sums = 9e418efa189c20053e887398df2253cf + md5sums = 7a09f1693613897add1791e7aead19c9 + md5sums = fb479854d8f481302edd8f4d3a3b6179 + md5sums = 3360d652ea425a60eae248da7d4c230d + +pkgname = glibc-widevine + pkgdesc = GNU C Library + install = glibc.install + depends = linux-api-headers>=4.10 + depends = tzdata + depends = filesystem + optdepends = gd: for memusagestat + backup = etc/gai.conf + backup = etc/locale.gen + backup = etc/nscd.conf diff --git a/0001-nptl_db-Support-different-libpthread-ld.so-load-orde.patch b/0001-nptl_db-Support-different-libpthread-ld.so-load-orde.patch new file mode 100644 index 000000000000..0b9c2efd4fe1 --- /dev/null +++ b/0001-nptl_db-Support-different-libpthread-ld.so-load-orde.patch @@ -0,0 +1,308 @@ +From a64afc225240b2b27129ccfb0516d7c958b98040 Mon Sep 17 00:00:00 2001 +From: Florian Weimer <fweimer@redhat.com> +Date: Wed, 21 Apr 2021 11:50:43 +0200 +Subject: [PATCH 364/576] nptl_db: Support different libpthread/ld.so load + orders (bug 27744) + +libthread_db is loaded once GDB encounters libpthread, and at this +point, ld.so may not have been processed by GDB yet. As a result, +_rtld_global cannot be accessed by regular means from libthread_db. +To make this work until GDB can be fixed, acess _rtld_global through +a pointer stored in libpthread. + +The new test does not reproduce bug 27744 with +--disable-hardcoded-path-in-tests, but is still a valid smoke test. +With --enable-hardcoded-path-in-tests, it is necessary to avoid +add-symbol-file because this can tickle a GDB bug. + +Fixes commit 1daccf403b1bd86370eb94edca794dc106d02039 ("nptl: Move +stack list variables into _rtld_global"). + +Tested-by: Emil Velikov <emil.velikov@collabora.com> +--- + nptl/Makefile | 19 +++- + nptl/pthread_create.c | 8 ++ + nptl/tst-pthread-gdb-attach-static.c | 1 + + nptl/tst-pthread-gdb-attach.c | 143 +++++++++++++++++++++++++++ + nptl_db/structs.def | 3 +- + nptl_db/td_init.c | 15 +-- + nptl_db/thread_dbP.h | 2 + + 7 files changed, 180 insertions(+), 11 deletions(-) + create mode 100644 nptl/tst-pthread-gdb-attach-static.c + create mode 100644 nptl/tst-pthread-gdb-attach.c + +diff --git a/nptl/Makefile b/nptl/Makefile +index 8fe92d43fa..e665d37e52 100644 +--- a/nptl/Makefile ++++ b/nptl/Makefile +@@ -313,7 +313,8 @@ tests = tst-attr2 tst-attr3 tst-default-attr \ + tst-thread-affinity-sched \ + tst-pthread-defaultattr-free \ + tst-pthread-attr-sigmask \ +- tst-pthread-timedlock-lockloop ++ tst-pthread-timedlock-lockloop \ ++ tst-pthread-gdb-attach tst-pthread-gdb-attach-static + + tests-container = tst-pthread-getattr + +@@ -359,6 +360,19 @@ CPPFLAGS-test-cond-printers.c := $(CFLAGS-printers-tests) + CPPFLAGS-test-rwlockattr-printers.c := $(CFLAGS-printers-tests) + CPPFLAGS-test-rwlock-printers.c := $(CFLAGS-printers-tests) + ++# Reuse the CFLAGS setting for the GDB attaching test. It needs ++# debugging information. ++CFLAGS-tst-pthread-gdb-attach.c := $(CFLAGS-printers-tests) ++CPPFLAGS-tst-pthread-gdb-attach.c := $(CFLAGS-printers-tests) ++ifeq ($(build-shared)$(build-hardcoded-path-in-tests),yesno) ++CPPFLAGS-tst-pthread-gdb-attach.c += -DDO_ADD_SYMBOL_FILE=1 ++else ++CPPFLAGS-tst-pthread-gdb-attach.c += -DDO_ADD_SYMBOL_FILE=0 ++endif ++CFLAGS-tst-pthread-gdb-attach-static.c := $(CFLAGS-printers-tests) ++CPPFLAGS-tst-pthread-gdb-attach-static.c := \ ++ $(CFLAGS-printers-tests) -DDO_ADD_SYMBOL_FILE=0 ++ + ifeq ($(build-shared),yes) + tests-printers-libs := $(shared-thread-library) + else +@@ -430,7 +444,8 @@ link-libc-static := $(common-objpfx)libc.a $(static-gnulib) \ + tests-static += tst-stackguard1-static \ + tst-cancel24-static \ + tst-mutex8-static tst-mutexpi8-static tst-sem11-static \ +- tst-sem12-static tst-cond11-static ++ tst-sem12-static tst-cond11-static \ ++ tst-pthread-gdb-attach-static + + tests += tst-cancel24-static + +diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c +index 6c645aff48..f13d8e44a4 100644 +--- a/nptl/pthread_create.c ++++ b/nptl/pthread_create.c +@@ -51,6 +51,14 @@ static td_thr_events_t __nptl_threads_events __attribute_used__; + /* Pointer to descriptor with the last event. */ + static struct pthread *__nptl_last_event __attribute_used__; + ++#ifdef SHARED ++/* This variable is used to access _rtld_global from libthread_db. If ++ GDB loads libpthread before ld.so, it is not possible to resolve ++ _rtld_global directly during libpthread initialization. */ ++static struct rtld_global *__nptl_rtld_global __attribute_used__ ++ = &_rtld_global; ++#endif ++ + /* Number of threads running. */ + unsigned int __nptl_nthreads = 1; + +diff --git a/nptl/tst-pthread-gdb-attach-static.c b/nptl/tst-pthread-gdb-attach-static.c +new file mode 100644 +index 0000000000..e159632cac +--- /dev/null ++++ b/nptl/tst-pthread-gdb-attach-static.c +@@ -0,0 +1 @@ ++#include "tst-pthread-gdb-attach.c" +diff --git a/nptl/tst-pthread-gdb-attach.c b/nptl/tst-pthread-gdb-attach.c +new file mode 100644 +index 0000000000..0603ad844d +--- /dev/null ++++ b/nptl/tst-pthread-gdb-attach.c +@@ -0,0 +1,143 @@ ++/* Smoke testing GDB process attach with thread-local variable access. ++ Copyright (C) 2021 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 ++ <https://www.gnu.org/licenses/>. */ ++ ++/* This test runs GDB against a forked copy of itself, to check ++ whether libthread_db can be loaded, and that access to thread-local ++ variables works. */ ++ ++#include <errno.h> ++#include <stdlib.h> ++#include <support/check.h> ++#include <support/support.h> ++#include <support/temp_file.h> ++#include <support/test-driver.h> ++#include <support/xstdio.h> ++#include <support/xthread.h> ++#include <support/xunistd.h> ++#include <unistd.h> ++ ++/* Starts out as zero, changed to 1 or 2 by the debugger, depending on ++ the thread. */ ++__thread volatile int altered_by_debugger; ++ ++/* Writes the GDB script to run the test to PATH. */ ++static void ++write_gdbscript (const char *path, int tested_pid) ++{ ++ FILE *fp = xfopen (path, "w"); ++ fprintf (fp, ++ "set trace-commands on\n" ++ "set debug libthread-db 1\n" ++#if DO_ADD_SYMBOL_FILE ++ /* Do not do this unconditionally to work around a GDB ++ assertion failure: ../../gdb/symtab.c:6404: ++ internal-error: CORE_ADDR get_msymbol_address(objfile*, ++ const minimal_symbol*): Assertion `(objf->flags & ++ OBJF_MAINLINE) == 0' failed. */ ++ "add-symbol-file %1$s/nptl/tst-pthread-gdb-attach\n" ++#endif ++ "set auto-load safe-path %1$s/nptl_db\n" ++ "set libthread-db-search-path %1$s/nptl_db\n" ++ "attach %2$d\n", ++ support_objdir_root, tested_pid); ++ fputs ("break debugger_inspection_point\n" ++ "continue\n" ++ "thread 1\n" ++ "print altered_by_debugger\n" ++ "print altered_by_debugger = 1\n" ++ "thread 2\n" ++ "print altered_by_debugger\n" ++ "print altered_by_debugger = 2\n" ++ "continue\n", ++ fp); ++ xfclose (fp); ++} ++ ++/* The test sets a breakpoint on this function and alters the ++ altered_by_debugger thread-local variable. */ ++void __attribute__ ((weak)) ++debugger_inspection_point (void) ++{ ++} ++ ++/* Thread function for the test thread in the subprocess. */ ++static void * ++subprocess_thread (void *closure) ++{ ++ /* Wait until altered_by_debugger changes the value away from 0. */ ++ while (altered_by_debugger == 0) ++ { ++ usleep (100 * 1000); ++ debugger_inspection_point (); ++ } ++ ++ TEST_COMPARE (altered_by_debugger, 2); ++ return NULL; ++} ++ ++/* This function implements the subprocess under test. It creates a ++ second thread, waiting for its value to change to 2, and checks ++ that the main thread also changed its value to 1. */ ++static void ++in_subprocess (void) ++{ ++ pthread_t thr = xpthread_create (NULL, subprocess_thread, NULL); ++ TEST_VERIFY (xpthread_join (thr) == NULL); ++ TEST_COMPARE (altered_by_debugger, 1); ++ _exit (0); ++} ++ ++static int ++do_test (void) ++{ ++ pid_t tested_pid = xfork (); ++ if (tested_pid == 0) ++ in_subprocess (); ++ char *tested_pid_string = xasprintf ("%d", tested_pid); ++ ++ char *gdbscript; ++ xclose (create_temp_file ("tst-pthread-gdb-attach-", &gdbscript)); ++ write_gdbscript (gdbscript, tested_pid); ++ ++ pid_t gdb_pid = xfork (); ++ if (gdb_pid == 0) ++ { ++ clearenv (); ++ xdup2 (STDOUT_FILENO, STDERR_FILENO); ++ execlp ("gdb", "gdb", "-nx", "-batch", "-x", gdbscript, NULL); ++ if (errno == ENOENT) ++ _exit (EXIT_UNSUPPORTED); ++ else ++ _exit (1); ++ } ++ ++ int status; ++ TEST_COMPARE (xwaitpid (gdb_pid, &status, 0), gdb_pid); ++ if (WIFEXITED (status) && WEXITSTATUS (status) == EXIT_UNSUPPORTED) ++ /* gdb is not installed. */ ++ return EXIT_UNSUPPORTED; ++ TEST_COMPARE (status, 0); ++ TEST_COMPARE (xwaitpid (tested_pid, &status, 0), tested_pid); ++ TEST_COMPARE (status, 0); ++ ++ free (tested_pid_string); ++ free (gdbscript); ++ return 0; ++} ++ ++#include <support/test-driver.c> +diff --git a/nptl_db/structs.def b/nptl_db/structs.def +index 999a9fc35a..8a613dd2f5 100644 +--- a/nptl_db/structs.def ++++ b/nptl_db/structs.def +@@ -100,8 +100,7 @@ DB_STRUCT_FIELD (pthread, dtvp) + #endif + + #if !(IS_IN (libpthread) && !defined SHARED) +-DB_STRUCT (rtld_global) +-DB_RTLD_VARIABLE (_rtld_global) ++DB_VARIABLE (__nptl_rtld_global) + #endif + DB_RTLD_GLOBAL_FIELD (dl_tls_dtv_slotinfo_list) + DB_RTLD_GLOBAL_FIELD (dl_stack_user) +diff --git a/nptl_db/td_init.c b/nptl_db/td_init.c +index 1d15681228..06b5adc5c2 100644 +--- a/nptl_db/td_init.c ++++ b/nptl_db/td_init.c +@@ -33,13 +33,14 @@ td_init (void) + bool + __td_ta_rtld_global (td_thragent_t *ta) + { +- if (ta->ta_addr__rtld_global == 0 +- && td_mod_lookup (ta->ph, LD_SO, SYM__rtld_global, +- &ta->ta_addr__rtld_global) != PS_OK) ++ if (ta->ta_addr__rtld_global == 0) + { +- ta->ta_addr__rtld_global = (void*)-1; +- return false; ++ psaddr_t rtldglobalp; ++ if (DB_GET_VALUE (rtldglobalp, ta, __nptl_rtld_global, 0) == TD_OK) ++ ta->ta_addr__rtld_global = rtldglobalp; ++ else ++ ta->ta_addr__rtld_global = (void *) -1; + } +- else +- return ta->ta_addr__rtld_global != (void*)-1; ++ ++ return ta->ta_addr__rtld_global != (void *)-1; + } +diff --git a/nptl_db/thread_dbP.h b/nptl_db/thread_dbP.h +index 580a70c471..712fa3aeb6 100644 +--- a/nptl_db/thread_dbP.h ++++ b/nptl_db/thread_dbP.h +@@ -108,6 +108,8 @@ struct td_thragent + # undef DB_SYMBOL + # undef DB_VARIABLE + ++ psaddr_t ta_addr__rtld_global; ++ + /* The method of locating a thread's th_unique value. */ + enum + { +-- +2.31.1 + diff --git a/0002-nptl-Check-for-compatible-GDB-in-nptl-tst-pthread-gd.patch b/0002-nptl-Check-for-compatible-GDB-in-nptl-tst-pthread-gd.patch new file mode 100644 index 000000000000..d3846d654ca7 --- /dev/null +++ b/0002-nptl-Check-for-compatible-GDB-in-nptl-tst-pthread-gd.patch @@ -0,0 +1,135 @@ +From f553dc066071a4465321fbc122bed8a75afd996b Mon Sep 17 00:00:00 2001 +From: Florian Weimer <fweimer@redhat.com> +Date: Thu, 22 Apr 2021 11:07:43 +0200 +Subject: [PATCH 405/576] nptl: Check for compatible GDB in + nptl/tst-pthread-gdb-attach + +Also do not clear the subprocess environment, in case running +GDB needs certain environment variables. +--- + nptl/tst-pthread-gdb-attach.c | 78 ++++++++++++++++++++++++++++++++++- + 1 file changed, 76 insertions(+), 2 deletions(-) + +diff --git a/nptl/tst-pthread-gdb-attach.c b/nptl/tst-pthread-gdb-attach.c +index 0603ad844d..901a120034 100644 +--- a/nptl/tst-pthread-gdb-attach.c ++++ b/nptl/tst-pthread-gdb-attach.c +@@ -20,8 +20,12 @@ + whether libthread_db can be loaded, and that access to thread-local + variables works. */ + ++#include <elf.h> + #include <errno.h> ++#include <fcntl.h> ++#include <stdbool.h> + #include <stdlib.h> ++#include <string.h> + #include <support/check.h> + #include <support/support.h> + #include <support/temp_file.h> +@@ -35,6 +39,49 @@ + the thread. */ + __thread volatile int altered_by_debugger; + ++/* Common prefix between 32-bit and 64-bit ELF. */ ++struct elf_prefix ++{ ++ unsigned char e_ident[EI_NIDENT]; ++ uint16_t e_type; ++ uint16_t e_machine; ++ uint32_t e_version; ++}; ++_Static_assert (sizeof (struct elf_prefix) == EI_NIDENT + 8, ++ "padding in struct elf_prefix"); ++ ++/* Reads the ELF header from PATH. Returns true if the header can be ++ read, false if the file is too short. */ ++static bool ++read_elf_header (const char *path, struct elf_prefix *elf) ++{ ++ int fd = xopen (path, O_RDONLY, 0); ++ bool result = read (fd, elf, sizeof (*elf)) == sizeof (*elf); ++ xclose (fd); ++ return result; ++} ++ ++/* Searches for "gdb" alongside the path variable. See execvpe. */ ++static char * ++find_gdb (void) ++{ ++ const char *path = getenv ("PATH"); ++ if (path == NULL) ++ return NULL; ++ while (true) ++ { ++ const char *colon = strchrnul (path, ':'); ++ char *candidate = xasprintf ("%.*s/gdb", (int) (colon - path), path); ++ if (access (candidate, X_OK) == 0) ++ return candidate; ++ free (candidate); ++ if (*colon == '\0') ++ break; ++ path = colon + 1; ++ } ++ return NULL; ++} ++ + /* Writes the GDB script to run the test to PATH. */ + static void + write_gdbscript (const char *path, int tested_pid) +@@ -105,6 +152,33 @@ in_subprocess (void) + static int + do_test (void) + { ++ char *gdb_path = find_gdb (); ++ if (gdb_path == NULL) ++ FAIL_UNSUPPORTED ("gdb command not found in PATH: %s", getenv ("PATH")); ++ ++ /* Check that libthread_db is compatible with the gdb architecture ++ because gdb loads it via dlopen. */ ++ { ++ char *threaddb_path = xasprintf ("%s/nptl_db/libthread_db.so", ++ support_objdir_root); ++ struct elf_prefix elf_threaddb; ++ TEST_VERIFY_EXIT (read_elf_header (threaddb_path, &elf_threaddb)); ++ struct elf_prefix elf_gdb; ++ /* If the ELF header cannot be read or "gdb" is not an ELF file, ++ assume this is a wrapper script that can run. */ ++ if (read_elf_header (gdb_path, &elf_gdb) ++ && memcmp (&elf_gdb, ELFMAG, SELFMAG) == 0) ++ { ++ if (elf_gdb.e_ident[EI_CLASS] != elf_threaddb.e_ident[EI_CLASS]) ++ FAIL_UNSUPPORTED ("GDB at %s has wrong class", gdb_path); ++ if (elf_gdb.e_ident[EI_DATA] != elf_threaddb.e_ident[EI_DATA]) ++ FAIL_UNSUPPORTED ("GDB at %s has wrong data", gdb_path); ++ if (elf_gdb.e_machine != elf_threaddb.e_machine) ++ FAIL_UNSUPPORTED ("GDB at %s has wrong machine", gdb_path); ++ } ++ free (threaddb_path); ++ } ++ + pid_t tested_pid = xfork (); + if (tested_pid == 0) + in_subprocess (); +@@ -117,9 +191,8 @@ do_test (void) + pid_t gdb_pid = xfork (); + if (gdb_pid == 0) + { +- clearenv (); + xdup2 (STDOUT_FILENO, STDERR_FILENO); +- execlp ("gdb", "gdb", "-nx", "-batch", "-x", gdbscript, NULL); ++ execl (gdb_path, "gdb", "-nx", "-batch", "-x", gdbscript, NULL); + if (errno == ENOENT) + _exit (EXIT_UNSUPPORTED); + else +@@ -137,6 +210,7 @@ do_test (void) + + free (tested_pid_string); + free (gdbscript); ++ free (gdb_path); + return 0; + } + +-- +2.31.1 + diff --git a/0003-nptl-Do-not-build-nptl-tst-pthread-gdb-attach-as-PIE.patch b/0003-nptl-Do-not-build-nptl-tst-pthread-gdb-attach-as-PIE.patch new file mode 100644 index 000000000000..1ba043d0233c --- /dev/null +++ b/0003-nptl-Do-not-build-nptl-tst-pthread-gdb-attach-as-PIE.patch @@ -0,0 +1,26 @@ +From 6f3e54d404cfe1ba7d1444e6dfcfd77b102d9287 Mon Sep 17 00:00:00 2001 +From: Florian Weimer <fweimer@redhat.com> +Date: Thu, 22 Apr 2021 19:53:15 +0200 +Subject: [PATCH 409/576] nptl: Do not build nptl/tst-pthread-gdb-attach as PIE + +--- + nptl/Makefile | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/nptl/Makefile b/nptl/Makefile +index a3d1ef8d66..294bb2faa4 100644 +--- a/nptl/Makefile ++++ b/nptl/Makefile +@@ -377,6 +377,9 @@ endif + CFLAGS-tst-pthread-gdb-attach-static.c := $(CFLAGS-printers-tests) + CPPFLAGS-tst-pthread-gdb-attach-static.c := \ + $(CFLAGS-printers-tests) -DDO_ADD_SYMBOL_FILE=0 ++# As of version 9.2, GDB cannot attach properly to PIE programs that ++# were launched with an explicit ld.so invocation. ++tst-pthread-gdb-attach-no-pie = yes + + ifeq ($(build-shared),yes) + tests-printers-libs := $(shared-thread-library) +-- +2.31.1 + diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..a0dd5dff2574 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,209 @@ +# Maintainer: Bart De Vries <bart at mogwai dot be> +# Contributor: Bartłomiej Piotrowski <bpiotrowski@archlinux.org> +# Contributor: Allan McRae <allan@archlinux.org> + +# toolchain build order: linux-api-headers->glibc->binutils->gcc->binutils->glibc +# NOTE: valgrind requires rebuilt with each major glibc version + +# ALARM: Kevin Mihelich <kevin@archlinuxarm.org> +# - Specify our build host type +# - Disabled distcc +# - Strip out Arch x86 multilib +# - Don't --enable-static-pie, broken on ARM +# - Don't --enable-cet, x86 only + +pkgname=glibc-widevine +provides=("glibc=2.33") +conflicts=("glibc") +pkgver=2.33 +pkgrel=5 +arch=('armv6h' 'armv7h' 'aarch64') +url='https://www.gnu.org/software/libc' +license=(GPL LGPL) +makedepends=(bison git gd python) +optdepends=('perl: for mtrace') +options=(!strip staticlibs !distcc) +#_commit=3de512be7ea6053255afed6154db9ee31d4e557a +#source=(git+https://sourceware.org/git/glibc.git#commit=$_commit +source=(https://ftp.gnu.org/gnu/glibc/glibc-$pkgver.tar.xz{,.sig} + locale.gen.txt + locale-gen + sdt.h sdt-config.h + bz27343.patch + 0001-nptl_db-Support-different-libpthread-ld.so-load-orde.patch + 0002-nptl-Check-for-compatible-GDB-in-nptl-tst-pthread-gd.patch + 0003-nptl-Do-not-build-nptl-tst-pthread-gdb-attach-as-PIE.patch + glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch + glibc-add-support-for-SHT_RELR-sections.patch) +validpgpkeys=(7273542B39962DF7B299931416792B4EA25340F8 # Carlos O'Donell + BC7C7372637EC10C57D7AA6579C43DFBF1CF2187 # Siddhesh Poyarekar + 16792B4EA25340F8) +md5sums=('390bbd889c7e8e8a7041564cb6b27cca' + 'SKIP' + '07ac979b6ab5eeb778d55f041529d623' + '476e9113489f93b348b21e144b6a8fcf' + '91fec3b7e75510ae2ac42533aa2e695e' + '680df504c683640b02ed4a805797c0b2' + 'cfe57018d06bf748b8ca1779980fef33' + '78f041fc66fee4ee372f13b00a99ff72' + '9e418efa189c20053e887398df2253cf' + '7a09f1693613897add1791e7aead19c9' + 'fb479854d8f481302edd8f4d3a3b6179' + '3360d652ea425a60eae248da7d4c230d') + +prepare() { + mkdir -p glibc-build + + [[ -d glibc-$pkgver ]] && ln -s glibc-$pkgver glibc + cd glibc + + # commit c3479fb7939898ec22c655c383454d6e8b982a67 + patch -p1 -i "$srcdir"/bz27343.patch + + # nptl_db: Support different libpthread/ld.so load orders (bug 27744) + patch -p1 -i "$srcdir"/0001-nptl_db-Support-different-libpthread-ld.so-load-orde.patch + + # nptl: Check for compatible GDB in nptl/tst-pthread-gdb-attach + patch -p1 -i "$srcdir"/0002-nptl-Check-for-compatible-GDB-in-nptl-tst-pthread-gd.patch + + # nptl: Do not build nptl/tst-pthread-gdb-attach as PIE + patch -p1 -i "$srcdir"/0003-nptl-Do-not-build-nptl-tst-pthread-gdb-attach-as-PIE.patch + + # sys-libs: Add support for SHT_RELR sections + patch -p1 -i "$srcdir"/glibc-add-support-for-SHT_RELR-sections.patch + + # dl-tls: libwidevinecdm 64Byte alignment + patch -p1 -i "$srcdir"/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch + +} + +build() { + local _configure_flags=( + --prefix=/usr + --with-headers=/usr/include + --with-bugurl=https://github.com/archlinuxarm/PKGBUILDs/issues + --enable-add-ons + --enable-bind-now + --enable-lock-elision + --disable-multi-arch + --enable-stack-protector=strong + --enable-stackguard-randomization + --enable-systemtap + --disable-profile + --disable-werror + ) + + cd "$srcdir/glibc-build" + + # ALARM: Specify build host types + [[ $CARCH == "arm" ]] && CONFIGFLAG="--host=armv5tel-unknown-linux-gnueabi --build=armv5tel-unknown-linux-gnueabi" + [[ $CARCH == "armv6h" ]] && CONFIGFLAG="--host=armv6l-unknown-linux-gnueabihf --build=armv6l-unknown-linux-gnueabihf" + [[ $CARCH == "armv7h" ]] && CONFIGFLAG="--host=armv7l-unknown-linux-gnueabihf --build=armv7l-unknown-linux-gnueabihf" + [[ $CARCH == "aarch64" ]] && CONFIGFLAG="--host=aarch64-unknown-linux-gnu --build=aarch64-unknown-linux-gnu" + + echo "slibdir=/usr/lib" >> configparms + echo "rtlddir=/usr/lib" >> configparms + echo "sbindir=/usr/bin" >> configparms + echo "rootsbindir=/usr/bin" >> configparms + + # remove fortify for building libraries + CPPFLAGS=${CPPFLAGS/-D_FORTIFY_SOURCE=2/} + + # + CFLAGS=${CFLAGS/-fno-plt/} + CXXFLAGS=${CXXFLAGS/-fno-plt/} + LDFLAGS=${LDFLAGS/,-z,now/} + + CFLAGS=${CFLAGS/-Wp,-D_FORTIFY_SOURCE=2/} + CXXFLAGS=${CXXFLAGS/-Wp,-D_FORTIFY_SOURCE=2/} + + "$srcdir/glibc/configure" \ + --libdir=/usr/lib \ + --libexecdir=/usr/lib \ + ${_configure_flags[@]} \ + $CONFIGFLAG + + # build libraries with fortify disabled + echo "build-programs=no" >> configparms + make + + # re-enable fortify for programs + sed -i "/build-programs=/s#no#yes#" configparms + + echo "CC += -D_FORTIFY_SOURCE=2" >> configparms + echo "CXX += -D_FORTIFY_SOURCE=2" >> configparms + make + + # build info pages manually for reprducibility + make info +} + +check() { + cd glibc-build + + # remove fortify in preparation to run test-suite + sed -i '/FORTIFY/d' configparms + + # some failures are "expected" + make check || true +} + +package() { + pkgdesc='GNU C Library' + depends=('linux-api-headers>=4.10' tzdata filesystem) + optdepends=('gd: for memusagestat') + install=glibc.install + backup=(etc/gai.conf + etc/locale.gen + etc/nscd.conf) + + install -dm755 "$pkgdir/etc" + touch "$pkgdir/etc/ld.so.conf" + + make -C glibc-build install_root="$pkgdir" install + rm -f "$pkgdir"/etc/ld.so.{cache,conf} + + # Shipped in tzdata + rm -f "$pkgdir"/usr/bin/{tzselect,zdump,zic} + + cd glibc + + install -dm755 "$pkgdir"/usr/lib/{locale,systemd/system,tmpfiles.d} + install -m644 nscd/nscd.conf "$pkgdir/etc/nscd.conf" + install -m644 nscd/nscd.service "$pkgdir/usr/lib/systemd/system" + install -m644 nscd/nscd.tmpfiles "$pkgdir/usr/lib/tmpfiles.d/nscd.conf" + install -dm755 "$pkgdir/var/db/nscd" + + install -m644 posix/gai.conf "$pkgdir"/etc/gai.conf + + install -m755 "$srcdir/locale-gen" "$pkgdir/usr/bin" + + # Create /etc/locale.gen + install -m644 "$srcdir/locale.gen.txt" "$pkgdir/etc/locale.gen" + sed -e '1,3d' -e 's|/| |g' -e 's|\\| |g' -e 's|^|#|g' \ + "$srcdir/glibc/localedata/SUPPORTED" >> "$pkgdir/etc/locale.gen" + + # ALARM: symlink ld-linux.so.3 for hard-float + [[ $CARCH == "armv6h" || $CARCH == "armv7h" ]] && ln -s /lib/ld-${pkgver}.so ${pkgdir}/usr/lib/ld-linux.so.3 + + if check_option 'debug' n; then + find "$pkgdir"/usr/bin -type f -executable -exec strip $STRIP_BINARIES {} + 2> /dev/null || true + find "$pkgdir"/usr/lib -name '*.a' -type f -exec strip $STRIP_STATIC {} + 2> /dev/null || true + + # Do not strip these for gdb and valgrind functionality, but strip the rest + find "$pkgdir"/usr/lib \ + -not -name 'ld-*.so' \ + -not -name 'libc-*.so' \ + -not -name 'libpthread-*.so' \ + -not -name 'libthread_db-*.so' \ + -name '*-*.so' -type f -exec strip $STRIP_SHARED {} + 2> /dev/null || true + fi + + # Provide tracing probes to libstdc++ for exceptions, possibly for other + # libraries too. Useful for gdb's catch command. + install -Dm644 "$srcdir/sdt.h" "$pkgdir/usr/include/sys/sdt.h" + install -Dm644 "$srcdir/sdt-config.h" "$pkgdir/usr/include/sys/sdt-config.h" + + # Provided by libxcrypt; keep the old shared library for backwards compatibility + rm -f "$pkgdir"/usr/include/crypt.h "$pkgdir"/usr/lib/libcrypt.{a,so} +} diff --git a/bz27343.patch b/bz27343.patch new file mode 100644 index 000000000000..3db6a9440eb2 --- /dev/null +++ b/bz27343.patch @@ -0,0 +1,48 @@ +From c3479fb7939898ec22c655c383454d6e8b982a67 Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich <slyfox@gentoo.org> +Date: Fri, 5 Feb 2021 07:32:18 +0000 +Subject: [PATCH] nsswitch: return result when nss database is locked [BZ + #27343] + +Before the change nss_database_check_reload_and_get() did not populate +the '*result' value when it returned success in a case of chroot +detection. This caused initgroups() to use garage pointer in the +following test (extracted from unbound): + +``` + +int main() { + // load some NSS modules + struct passwd * pw = getpwnam("root"); + + chdir("/tmp"); + chroot("/tmp"); + chdir("/"); + // access nsswitch.conf in a chroot + initgroups("root", 0); +} +``` + +Reviewed-by: DJ Delorie <dj@redhat.com> +--- + nss/nss_database.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/nss/nss_database.c b/nss/nss_database.c +index cf0306adc4..e1bef6bd75 100644 +--- a/nss/nss_database.c ++++ b/nss/nss_database.c +@@ -398,8 +398,9 @@ nss_database_check_reload_and_get (struct nss_database_state *local, + && (str.st_ino != local->root_ino + || str.st_dev != local->root_dev))) + { +- /* Change detected; disable reloading. */ ++ /* Change detected; disable reloading and return current state. */ + atomic_store_release (&local->data.reload_disabled, 1); ++ *result = local->data.services[database_index]; + __libc_lock_unlock (local->lock); + __nss_module_disable_loading (); + return true; +-- +2.27.0 + diff --git a/glibc-add-support-for-SHT_RELR-sections.patch b/glibc-add-support-for-SHT_RELR-sections.patch new file mode 100644 index 000000000000..485c7703ac38 --- /dev/null +++ b/glibc-add-support-for-SHT_RELR-sections.patch @@ -0,0 +1,348 @@ +From 6676e967dba405ca31d57b63e096becd13d4a200 Mon Sep 17 00:00:00 2001 +From: Rahul Chaudhry <rahulchaudhry@chromium.org> +Date: Thu, 15 Mar 2018 14:30:17 -0700 +Subject: [PATCH 4/8] sys-libs/glibc: add support for SHT_RELR sections. + +This patch adds experimental support for SHT_RELR sections, proposed +here: https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg + +SHT_RELR sections are supported for arm, aarch64, and x86_64 targets. +To enable them, pass '--experimental-use-relr' flag to gold. + +Definitions for the new ELF section type and dynamic array tags, as well +as the encoding used in the new section are all under discussion and are +subject to change. We plan to send the patch upstream after the gABI has +been updated to include the new definitions. + +[Adrian: forward-ported to glibc 2.32] +--- + elf/do-rel.h | 41 ++++++++++++++++++++++++++++++++++-- + elf/dynamic-link.h | 15 +++++++++++++ + elf/elf.h | 15 +++++++++++-- + elf/get-dynamic-info.h | 7 ++++++ + sysdeps/aarch64/dl-machine.h | 10 +++++++++ + sysdeps/arm/dl-machine.h | 10 +++++++++ + sysdeps/i386/dl-machine.h | 10 +++++++++ + sysdeps/x86_64/dl-machine.h | 10 +++++++++ + 8 files changed, 114 insertions(+), 4 deletions(-) + +diff --git a/elf/do-rel.h b/elf/do-rel.h +index 1d0a1f2c5d..25babef6e1 100644 +--- a/elf/do-rel.h ++++ b/elf/do-rel.h +@@ -26,6 +26,12 @@ + # define elf_machine_rel_relative elf_machine_rela_relative + #endif + ++#ifdef DO_RELR ++# define elf_dynamic_do_Rel elf_dynamic_do_Relr ++# define Rel Relr ++# define elf_machine_rel_relative elf_machine_relr_relative ++#endif ++ + #ifndef DO_ELF_MACHINE_REL_RELATIVE + # define DO_ELF_MACHINE_REL_RELATIVE(map, l_addr, relative) \ + elf_machine_rel_relative (l_addr, relative, \ +@@ -46,12 +52,12 @@ elf_dynamic_do_Rel (struct link_map *map, + const ElfW(Rel) *r = (const void *) reladdr; + const ElfW(Rel) *end = (const void *) (reladdr + relsize); + ElfW(Addr) l_addr = map->l_addr; +-# if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP ++# if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP && !defined DO_RELR + const ElfW(Rel) *r2 = NULL; + const ElfW(Rel) *end2 = NULL; + # endif + +-#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP ++#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP && !defined DO_RELR + /* We never bind lazily during ld.so bootstrap. Unfortunately gcc is + not clever enough to see through all the function calls to realize + that. */ +@@ -80,8 +86,10 @@ elf_dynamic_do_Rel (struct link_map *map, + else + #endif + { ++# if !defined DO_RELR + const ElfW(Sym) *const symtab = + (const void *) D_PTR (map, l_info[DT_SYMTAB]); ++# endif + const ElfW(Rel) *relative = r; + r += nrelative; + +@@ -108,9 +116,36 @@ elf_dynamic_do_Rel (struct link_map *map, + if (l_addr != 0 || ! map->l_info[VALIDX(DT_GNU_PRELINKED)]) + # endif + #endif ++ ++#ifdef DO_RELR ++ { ++ ElfW(Addr) base = 0; ++ for (; relative < end; ++relative) ++ { ++ ElfW(Relr) entry = *relative; ++ if ((entry&1) == 0) ++ { ++ elf_machine_relr_relative (l_addr, (void *) (l_addr + entry)); ++ base = entry + sizeof(ElfW(Addr)); ++ continue; ++ } ++ ElfW(Addr) offset = base; ++ while (entry != 0) ++ { ++ entry >>= 1; ++ if ((entry&1) != 0) ++ elf_machine_relr_relative (l_addr, (void *) (l_addr + offset)); ++ offset += sizeof(ElfW(Addr)); ++ } ++ base += (8*sizeof(ElfW(Addr)) - 1) * sizeof(ElfW(Addr)); ++ } ++ } ++#else + for (; relative < r; ++relative) + DO_ELF_MACHINE_REL_RELATIVE (map, l_addr, relative); ++#endif + ++#if !defined DO_RELR + #ifdef RTLD_BOOTSTRAP + /* The dynamic linker always uses versioning. */ + assert (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL); +@@ -179,6 +214,7 @@ elf_dynamic_do_Rel (struct link_map *map, + skip_ifunc); + # endif + } ++#endif + #endif + } + } +@@ -189,3 +225,4 @@ elf_dynamic_do_Rel (struct link_map *map, + #undef elf_machine_rel_relative + #undef DO_ELF_MACHINE_REL_RELATIVE + #undef DO_RELA ++#undef DO_RELR +diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h +index 6727233e1a..4345df9949 100644 +--- a/elf/dynamic-link.h ++++ b/elf/dynamic-link.h +@@ -76,6 +76,11 @@ auto inline void __attribute__((always_inline)) + elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, + void *const reloc_addr); + # endif ++# if ! ELF_MACHINE_NO_RELR ++auto inline void __attribute__((always_inline)) ++elf_machine_relr_relative (ElfW(Addr) l_addr, ++ void *const reloc_addr); ++# endif + # if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL + auto inline void __attribute__((always_inline)) + elf_machine_lazy_rel (struct link_map *map, +@@ -190,6 +195,15 @@ elf_machine_lazy_rel (struct link_map *map, + # define ELF_DYNAMIC_DO_RELA(map, lazy, skip_ifunc) /* Nothing to do. */ + # endif + ++# if ! ELF_MACHINE_NO_RELR ++# define DO_RELR ++# include "do-rel.h" ++# define ELF_DYNAMIC_DO_RELR(map, lazy, skip_ifunc) \ ++ _ELF_DYNAMIC_DO_RELOC (RELR, Relr, map, lazy, skip_ifunc, 1) ++# else ++# define ELF_DYNAMIC_DO_RELR(map, lazy, skip_ifunc) /* Nothing to do. */ ++# endif ++ + /* This can't just be an inline function because GCC is too dumb + to inline functions containing inlines themselves. */ + # define ELF_DYNAMIC_RELOCATE(map, lazy, consider_profile, skip_ifunc) \ +@@ -198,6 +212,7 @@ elf_machine_lazy_rel (struct link_map *map, + (consider_profile)); \ + ELF_DYNAMIC_DO_REL ((map), edr_lazy, skip_ifunc); \ + ELF_DYNAMIC_DO_RELA ((map), edr_lazy, skip_ifunc); \ ++ ELF_DYNAMIC_DO_RELR ((map), edr_lazy, skip_ifunc); \ + } while (0) + + #endif + +diff --git a/elf/elf.h b/elf/elf.h +index 197b557d15..5b6da8e8ae 100644 +--- a/elf/elf.h ++++ b/elf/elf.h +@@ -442,7 +442,8 @@ typedef struct + #define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */ + #define SHT_GROUP 17 /* Section group */ + #define SHT_SYMTAB_SHNDX 18 /* Extended section indices */ +-#define SHT_NUM 19 /* Number of defined types. */ ++#define SHT_RELR 19 /* Relative relocation, only offsets */ ++#define SHT_NUM 20 /* Number of defined types. */ + #define SHT_LOOS 0x60000000 /* Start OS-specific. */ + #define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */ + #define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */ +@@ -664,6 +665,12 @@ typedef struct + Elf64_Sxword r_addend; /* Addend */ + } Elf64_Rela; + ++/* Relocation table entry for relative (in section of type SHT_RELR). */ ++ ++typedef Elf32_Word Elf32_Relr; /* offset/bitmap for relative relocations */ ++ ++typedef Elf64_Xword Elf64_Relr; /* offset/bitmap for relative relocations */ ++ + /* How to extract and insert information held in the r_info field. */ + + #define ELF32_R_SYM(val) ((val) >> 8) +@@ -885,7 +892,10 @@ typedef struct + #define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ + #define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ + #define DT_SYMTAB_SHNDX 34 /* Address of SYMTAB_SHNDX section */ +-#define DT_NUM 35 /* Number used */ ++#define DT_RELRSZ 35 ++#define DT_RELR 36 ++#define DT_RELRENT 37 ++#define DT_NUM 38 /* Number used */ + #define DT_LOOS 0x6000000d /* Start of OS-specific */ + #define DT_HIOS 0x6ffff000 /* End of OS-specific */ + #define DT_LOPROC 0x70000000 /* Start of processor-specific */ +@@ -937,6 +947,7 @@ typedef struct + GNU extension. */ + #define DT_VERSYM 0x6ffffff0 + ++#define DT_RELRCOUNT 0x6ffffff8 + #define DT_RELACOUNT 0x6ffffff9 + #define DT_RELCOUNT 0x6ffffffa + +diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h +index 4f6a86ef37..79ff22f0c0 100644 +--- a/elf/get-dynamic-info.h ++++ b/elf/get-dynamic-info.h +@@ -108,6 +108,9 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp) + # if ! ELF_MACHINE_NO_REL + ADJUST_DYN_INFO (DT_REL); + # endif ++# if ! ELF_MACHINE_NO_RELR ++ ADJUST_DYN_INFO (DT_RELR); ++#endif + ADJUST_DYN_INFO (DT_JMPREL); + ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM)); + ADJUST_DYN_INFO (ADDRIDX (DT_GNU_HASH)); +@@ -134,6 +137,10 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp) + if (info[DT_REL] != NULL) + assert (info[DT_RELENT]->d_un.d_val == sizeof (ElfW(Rel))); + #endif ++#if ! ELF_MACHINE_NO_RELR ++ if (info[DT_RELR] != NULL) ++ assert (info[DT_RELRENT]->d_un.d_val == sizeof (ElfW(Relr))); ++# endif + #ifdef RTLD_BOOTSTRAP + /* Only the bind now flags are allowed. */ + assert (info[VERSYMIDX (DT_FLAGS_1)] == NULL +diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h +index fde7cfd9e2..eaff6dbc6d 100644 +--- a/sysdeps/aarch64/dl-machine.h ++++ b/sysdeps/aarch64/dl-machine.h +@@ -198,6 +198,7 @@ _dl_start_user: \n\ + /* AArch64 uses RELA not REL */ + #define ELF_MACHINE_NO_REL 1 + #define ELF_MACHINE_NO_RELA 0 ++#define ELF_MACHINE_NO_RELR 0 + + #define DL_PLATFORM_INIT dl_platform_init () + +@@ -383,6 +384,15 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, + *reloc_addr = l_addr + reloc->r_addend; + } + ++inline void ++__attribute__ ((always_inline)) ++elf_machine_relr_relative (ElfW(Addr) l_addr, ++ void *const reloc_addr_arg) ++{ ++ ElfW(Addr) *const reloc_addr = reloc_addr_arg; ++ *reloc_addr += l_addr; ++} ++ + inline void + __attribute__ ((always_inline)) + elf_machine_lazy_rel (struct link_map *map, +diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h +index 90856779b1..c586232c9d 100644 +--- a/sysdeps/arm/dl-machine.h ++++ b/sysdeps/arm/dl-machine.h +@@ -296,6 +296,7 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc, + Prelinked libraries may use Elf32_Rela though. */ + #define ELF_MACHINE_NO_RELA defined RTLD_BOOTSTRAP + #define ELF_MACHINE_NO_REL 0 ++#define ELF_MACHINE_NO_RELR 0 + + /* Names of the architecture-specific auditing callback functions. */ + #define ARCH_LA_PLTENTER arm_gnu_pltenter +@@ -637,6 +638,15 @@ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc, + *reloc_addr += l_addr; + } + ++auto inline void ++__attribute ((always_inline)) ++elf_machine_relr_relative (ElfW(Addr) l_addr, ++ void *const reloc_addr_arg) ++{ ++ ElfW(Addr) *const reloc_addr = reloc_addr_arg; ++ *reloc_addr += l_addr; ++} ++ + # ifndef RTLD_BOOTSTRAP + auto inline void + __attribute__ ((always_inline)) +diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h +index 672d8f27ce..7c09608913 100644 +--- a/sysdeps/i386/dl-machine.h ++++ b/sysdeps/i386/dl-machine.h +@@ -286,6 +286,7 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc, + Prelinked libraries may use Elf32_Rela though. */ + #define ELF_MACHINE_NO_RELA defined RTLD_BOOTSTRAP + #define ELF_MACHINE_NO_REL 0 ++#define ELF_MACHINE_NO_RELR 0 + + #ifdef RESOLVE_MAP + +@@ -658,6 +659,15 @@ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc, + *reloc_addr += l_addr; + } + ++auto inline void ++__attribute ((always_inline)) ++elf_machine_relr_relative (ElfW(Addr) l_addr, ++ void *const reloc_addr_arg) ++{ ++ ElfW(Addr) *const reloc_addr = reloc_addr_arg; ++ *reloc_addr += l_addr; ++} ++ + # ifndef RTLD_BOOTSTRAP + auto inline void + __attribute__ ((always_inline)) +diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h +index 363a749cb2..10a200ba67 100644 +--- a/sysdeps/x86_64/dl-machine.h ++++ b/sysdeps/x86_64/dl-machine.h +@@ -214,6 +214,7 @@ _dl_start_user:\n\ + /* The x86-64 never uses Elf64_Rel/Elf32_Rel relocations. */ + #define ELF_MACHINE_NO_REL 1 + #define ELF_MACHINE_NO_RELA 0 ++#define ELF_MACHINE_NO_RELR 0 + + /* We define an initialization function. This is called very early in + _dl_sysdep_start. */ +@@ -549,6 +550,15 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, + } + } + ++auto inline void ++__attribute ((always_inline)) ++elf_machine_relr_relative (ElfW(Addr) l_addr, ++ void *const reloc_addr_arg) ++{ ++ ElfW(Addr) *const reloc_addr = reloc_addr_arg; ++ *reloc_addr += l_addr; ++} ++ + auto inline void + __attribute ((always_inline)) + elf_machine_lazy_rel (struct link_map *map, +-- +2.30.2 diff --git a/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch b/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch new file mode 100644 index 000000000000..1a84602b109b --- /dev/null +++ b/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch @@ -0,0 +1,31 @@ +From 61b3b546450ae0a70cb4a57fbb0e0fc47b331370 Mon Sep 17 00:00:00 2001 +From: Portisch <hugo.portisch@yahoo.de> +Date: Sat, 5 Jun 2021 19:41:25 +0200 +Subject: [PATCH] tls: libwidevinecdm.so: since 4.10.2252.0 has TLS with + 64-byte alignment Change the max_align to 64U instead 16 to make it possible + to use dlopen again. Tests by changing TLS_TCB_ALIGN directly showed up some + random crashes. Reverence: https://lkml.org/lkml/2020/7/3/754 + +--- + elf/dl-tls.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/elf/dl-tls.c b/elf/dl-tls.c +index 9fa62f5d..d8f2f740 100644 +--- a/elf/dl-tls.c ++++ b/elf/dl-tls.c +@@ -213,6 +213,11 @@ void + _dl_determine_tlsoffset (void) + { + size_t max_align = TLS_TCB_ALIGN; ++ /* libwidevinecdm.so: since 4.10.2252.0 has TLS with 64-byte alignment. ++ Since TLS is initialized before audit modules are loaded and slotinfo ++ information is available, this is not taken into account below in ++ the audit case. */ ++ max_align = MAX (max_align, 64U); + size_t freetop = 0; + size_t freebottom = 0; + +-- +2.31.1 + diff --git a/glibc.install b/glibc.install new file mode 100644 index 000000000000..351f05b263cb --- /dev/null +++ b/glibc.install @@ -0,0 +1,5 @@ +post_upgrade() { + locale-gen + + ldconfig -r . +} diff --git a/locale-gen b/locale-gen new file mode 100644 index 000000000000..5aff344c4e91 --- /dev/null +++ b/locale-gen @@ -0,0 +1,42 @@ +#!/bin/sh + +set -e + +LOCALEGEN=/etc/locale.gen +LOCALES=/usr/share/i18n/locales +if [ -n "$POSIXLY_CORRECT" ]; then + unset POSIXLY_CORRECT +fi + + +[ -f $LOCALEGEN -a -s $LOCALEGEN ] || exit 0; + +# Remove all old locale dir and locale-archive before generating new +# locale data. +rm -rf /usr/lib/locale/* || true + +umask 022 + +is_entry_ok() { + if [ -n "$locale" -a -n "$charset" ] ; then + true + else + echo "error: Bad entry '$locale $charset'" + false + fi +} + +echo "Generating locales..." +while read locale charset; do \ + case $locale in \#*) continue;; "") continue;; esac; \ + is_entry_ok || continue + echo -n " `echo $locale | sed 's/\([^.\@]*\).*/\1/'`"; \ + echo -n ".$charset"; \ + echo -n `echo $locale | sed 's/\([^\@]*\)\(\@.*\)*/\2/'`; \ + echo -n '...'; \ + if [ -f $LOCALES/$locale ]; then input=$locale; else \ + input=`echo $locale | sed 's/\([^.]*\)[^@]*\(.*\)/\1\2/'`; fi; \ + localedef -i $input -c -f $charset -A /usr/share/locale/locale.alias $locale; \ + echo ' done'; \ +done < $LOCALEGEN +echo "Generation complete." diff --git a/locale.gen.txt b/locale.gen.txt new file mode 100644 index 000000000000..ccdd817342c7 --- /dev/null +++ b/locale.gen.txt @@ -0,0 +1,23 @@ +# Configuration file for locale-gen +# +# lists of locales that are to be generated by the locale-gen command. +# +# Each line is of the form: +# +# <locale> <charset> +# +# where <locale> is one of the locales given in /usr/share/i18n/locales +# and <charset> is one of the character sets listed in /usr/share/i18n/charmaps +# +# Examples: +# en_US ISO-8859-1 +# en_US.UTF-8 UTF-8 +# de_DE ISO-8859-1 +# de_DE@euro ISO-8859-15 +# +# The locale-gen command will generate all the locales, +# placing them in /usr/lib/locale. +# +# A list of supported locales is included in this file. +# Uncomment the ones you need. +# diff --git a/sdt-config.h b/sdt-config.h new file mode 100644 index 000000000000..733045a52771 --- /dev/null +++ b/sdt-config.h @@ -0,0 +1,6 @@ +/* includes/sys/sdt-config.h. Generated from sdt-config.h.in by configure. + + This file just defines _SDT_ASM_SECTION_AUTOGROUP_SUPPORT to 0 or 1 to + indicate whether the assembler supports "?" in .pushsection directives. */ + +#define _SDT_ASM_SECTION_AUTOGROUP_SUPPORT 1 diff --git a/sdt.h b/sdt.h new file mode 100644 index 000000000000..c0c5a492cb9c --- /dev/null +++ b/sdt.h @@ -0,0 +1,430 @@ +/* <sys/sdt.h> - Systemtap static probe definition macros. + + This file is dedicated to the public domain, pursuant to CC0 + (https://creativecommons.org/publicdomain/zero/1.0/) +*/ + +#ifndef _SYS_SDT_H +#define _SYS_SDT_H 1 + +/* + This file defines a family of macros + + STAP_PROBEn(op1, ..., opn) + + that emit a nop into the instruction stream, and some data into an auxiliary + note section. The data in the note section describes the operands, in terms + of size and location. Each location is encoded as assembler operand string. + Consumer tools such as gdb or systemtap insert breakpoints on top of + the nop, and decode the location operand-strings, like an assembler, + to find the values being passed. + + The operand strings are selected by the compiler for each operand. + They are constrained by gcc inline-assembler codes. The default is: + + #define STAP_SDT_ARG_CONSTRAINT nor + + This is a good default if the operands tend to be integral and + moderate in number (smaller than number of registers). In other + cases, the compiler may report "'asm' requires impossible reload" or + similar. In this case, consider simplifying the macro call (fewer + and simpler operands), reduce optimization, or override the default + constraints string via: + + #define STAP_SDT_ARG_CONSTRAINT g + #include <sys/sdt.h> + + See also: + https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation + https://gcc.gnu.org/onlinedocs/gcc/Constraints.html + */ + + + +#ifdef __ASSEMBLER__ +# define _SDT_PROBE(provider, name, n, arglist) \ + _SDT_ASM_BODY(provider, name, _SDT_ASM_STRING_1, (_SDT_DEPAREN_##n arglist)) \ + _SDT_ASM_BASE +# define _SDT_ASM_1(x) x; +# define _SDT_ASM_2(a, b) a,b; +# define _SDT_ASM_3(a, b, c) a,b,c; +# define _SDT_ASM_5(a, b, c, d, e) a,b,c,d,e; +# define _SDT_ASM_STRING_1(x) .asciz #x; +# define _SDT_DEPAREN_0() /* empty */ +# define _SDT_DEPAREN_1(a) a +# define _SDT_DEPAREN_2(a,b) a b +# define _SDT_DEPAREN_3(a,b,c) a b c +# define _SDT_DEPAREN_4(a,b,c,d) a b c d +# define _SDT_DEPAREN_5(a,b,c,d,e) a b c d e +# define _SDT_DEPAREN_6(a,b,c,d,e,f) a b c d e f +# define _SDT_DEPAREN_7(a,b,c,d,e,f,g) a b c d e f g +# define _SDT_DEPAREN_8(a,b,c,d,e,f,g,h) a b c d e f g h +# define _SDT_DEPAREN_9(a,b,c,d,e,f,g,h,i) a b c d e f g h i +# define _SDT_DEPAREN_10(a,b,c,d,e,f,g,h,i,j) a b c d e f g h i j +# define _SDT_DEPAREN_11(a,b,c,d,e,f,g,h,i,j,k) a b c d e f g h i j k +# define _SDT_DEPAREN_12(a,b,c,d,e,f,g,h,i,j,k,l) a b c d e f g h i j k l +#else +# define _SDT_PROBE(provider, name, n, arglist) \ + do { \ + __asm__ __volatile__ (_SDT_ASM_BODY(provider, name, _SDT_ASM_ARGS, (n)) \ + :: _SDT_ASM_OPERANDS_##n arglist); \ + __asm__ __volatile__ (_SDT_ASM_BASE); \ + } while (0) +# define _SDT_S(x) #x +# define _SDT_ASM_1(x) _SDT_S(x) "\n" +# define _SDT_ASM_2(a, b) _SDT_S(a) "," _SDT_S(b) "\n" +# define _SDT_ASM_3(a, b, c) _SDT_S(a) "," _SDT_S(b) "," \ + _SDT_S(c) "\n" +# define _SDT_ASM_5(a, b, c, d, e) _SDT_S(a) "," _SDT_S(b) "," \ + _SDT_S(c) "," _SDT_S(d) "," \ + _SDT_S(e) "\n" +# define _SDT_ASM_ARGS(n) _SDT_ASM_STRING(_SDT_ASM_TEMPLATE_##n) +# define _SDT_ASM_STRING_1(x) _SDT_ASM_1(.asciz #x) + +# define _SDT_ARGFMT(no) %n[_SDT_S##no]@_SDT_ARGTMPL(_SDT_A##no) + +# ifndef STAP_SDT_ARG_CONSTRAINT +# if defined __powerpc__ +# define STAP_SDT_ARG_CONSTRAINT nZr +# else +# define STAP_SDT_ARG_CONSTRAINT nor +# endif +# endif + +# define _SDT_STRINGIFY(x) #x +# define _SDT_ARG_CONSTRAINT_STRING(x) _SDT_STRINGIFY(x) +# define _SDT_ARG(n, x) \ + [_SDT_S##n] "n" ((_SDT_ARGSIGNED (x) ? 1 : -1) * (int) _SDT_ARGSIZE (x)), \ + [_SDT_A##n] _SDT_ARG_CONSTRAINT_STRING (STAP_SDT_ARG_CONSTRAINT) (_SDT_ARGVAL (x)) +#endif +#define _SDT_ASM_STRING(x) _SDT_ASM_STRING_1(x) + +#define _SDT_ARGARRAY(x) (__builtin_classify_type (x) == 14 \ + || __builtin_classify_type (x) == 5) + +#ifdef __cplusplus +# define _SDT_ARGSIGNED(x) (!_SDT_ARGARRAY (x) \ + && __sdt_type<__typeof (x)>::__sdt_signed) +# define _SDT_ARGSIZE(x) (_SDT_ARGARRAY (x) \ + ? sizeof (void *) : sizeof (x)) +# define _SDT_ARGVAL(x) (x) + +# include <cstddef> + +template<typename __sdt_T> +struct __sdt_type +{ + static const bool __sdt_signed = false; +}; + +#define __SDT_ALWAYS_SIGNED(T) \ +template<> struct __sdt_type<T> { static const bool __sdt_signed = true; }; +#define __SDT_COND_SIGNED(T,CT) \ +template<> struct __sdt_type<T> { static const bool __sdt_signed = ((CT)(-1) < 1); }; +__SDT_ALWAYS_SIGNED(signed char) +__SDT_ALWAYS_SIGNED(short) +__SDT_ALWAYS_SIGNED(int) +__SDT_ALWAYS_SIGNED(long) +__SDT_ALWAYS_SIGNED(long long) +__SDT_ALWAYS_SIGNED(volatile signed char) +__SDT_ALWAYS_SIGNED(volatile short) +__SDT_ALWAYS_SIGNED(volatile int) +__SDT_ALWAYS_SIGNED(volatile long) +__SDT_ALWAYS_SIGNED(volatile long long) +__SDT_ALWAYS_SIGNED(const signed char) +__SDT_ALWAYS_SIGNED(const short) +__SDT_ALWAYS_SIGNED(const int) +__SDT_ALWAYS_SIGNED(const long) +__SDT_ALWAYS_SIGNED(const long long) +__SDT_ALWAYS_SIGNED(const volatile signed char) +__SDT_ALWAYS_SIGNED(const volatile short) +__SDT_ALWAYS_SIGNED(const volatile int) +__SDT_ALWAYS_SIGNED(const volatile long) +__SDT_ALWAYS_SIGNED(const volatile long long) +__SDT_COND_SIGNED(char, char) +__SDT_COND_SIGNED(wchar_t, wchar_t) +__SDT_COND_SIGNED(volatile char, char) +__SDT_COND_SIGNED(volatile wchar_t, wchar_t) +__SDT_COND_SIGNED(const char, char) +__SDT_COND_SIGNED(const wchar_t, wchar_t) +__SDT_COND_SIGNED(const volatile char, char) +__SDT_COND_SIGNED(const volatile wchar_t, wchar_t) +#if defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +/* __SDT_COND_SIGNED(char16_t) */ +/* __SDT_COND_SIGNED(char32_t) */ +#endif + +template<typename __sdt_E> +struct __sdt_type<__sdt_E[]> : public __sdt_type<__sdt_E *> {}; + +template<typename __sdt_E, size_t __sdt_N> +struct __sdt_type<__sdt_E[__sdt_N]> : public __sdt_type<__sdt_E *> {}; + +#elif !defined(__ASSEMBLER__) +__extension__ extern unsigned long long __sdt_unsp; +# define _SDT_ARGINTTYPE(x) \ + __typeof (__builtin_choose_expr (((__builtin_classify_type (x) \ + + 3) & -4) == 4, (x), 0U)) +# define _SDT_ARGSIGNED(x) \ + (!__extension__ \ + (__builtin_constant_p ((((unsigned long long) \ + (_SDT_ARGINTTYPE (x)) __sdt_unsp) \ + & ((unsigned long long)1 << (sizeof (unsigned long long) \ + * __CHAR_BIT__ - 1))) == 0) \ + || (_SDT_ARGINTTYPE (x)) -1 > (_SDT_ARGINTTYPE (x)) 0)) +# define _SDT_ARGSIZE(x) \ + (_SDT_ARGARRAY (x) ? sizeof (void *) : sizeof (x)) +# define _SDT_ARGVAL(x) (x) +#endif + +#if defined __powerpc__ || defined __powerpc64__ +# define _SDT_ARGTMPL(id) %I[id]%[id] +#elif defined __i386__ +# define _SDT_ARGTMPL(id) %w[id] /* gcc.gnu.org/PR80115 */ +#else +# define _SDT_ARGTMPL(id) %[id] +#endif + +#ifdef __LP64__ +# define _SDT_ASM_ADDR .8byte +#else +# define _SDT_ASM_ADDR .4byte +#endif + +/* The ia64 and s390 nop instructions take an argument. */ +#if defined(__ia64__) || defined(__s390__) || defined(__s390x__) +#define _SDT_NOP nop 0 +#else +#define _SDT_NOP nop +#endif + +#define _SDT_NOTE_NAME "stapsdt" +#define _SDT_NOTE_TYPE 3 + +/* If the assembler supports the necessary feature, then we can play + nice with code in COMDAT sections, which comes up in C++ code. + Without that assembler support, some combinations of probe placements + in certain kinds of C++ code may produce link-time errors. */ +#include "sdt-config.h" +#if _SDT_ASM_SECTION_AUTOGROUP_SUPPORT +# define _SDT_ASM_AUTOGROUP "?" +#else +# define _SDT_ASM_AUTOGROUP "" +#endif + +#define _SDT_ASM_BODY(provider, name, pack_args, args) \ + _SDT_ASM_1(990: _SDT_NOP) \ + _SDT_ASM_3( .pushsection .note.stapsdt,_SDT_ASM_AUTOGROUP,"note") \ + _SDT_ASM_1( .balign 4) \ + _SDT_ASM_3( .4byte 992f-991f, 994f-993f, _SDT_NOTE_TYPE) \ + _SDT_ASM_1(991: .asciz _SDT_NOTE_NAME) \ + _SDT_ASM_1(992: .balign 4) \ + _SDT_ASM_1(993: _SDT_ASM_ADDR 990b) \ + _SDT_ASM_1( _SDT_ASM_ADDR _.stapsdt.base) \ + _SDT_SEMAPHORE(provider,name) \ + _SDT_ASM_STRING(provider) \ + _SDT_ASM_STRING(name) \ + pack_args args \ + _SDT_ASM_1(994: .balign 4) \ + _SDT_ASM_1( .popsection) + +#define _SDT_ASM_BASE \ + _SDT_ASM_1(.ifndef _.stapsdt.base) \ + _SDT_ASM_5( .pushsection .stapsdt.base,"aG","progbits", \ + .stapsdt.base,comdat) \ + _SDT_ASM_1( .weak _.stapsdt.base) \ + _SDT_ASM_1( .hidden _.stapsdt.base) \ + _SDT_ASM_1( _.stapsdt.base: .space 1) \ + _SDT_ASM_2( .size _.stapsdt.base, 1) \ + _SDT_ASM_1( .popsection) \ + _SDT_ASM_1(.endif) + +#if defined _SDT_HAS_SEMAPHORES +#define _SDT_SEMAPHORE(p,n) _SDT_ASM_1( _SDT_ASM_ADDR p##_##n##_semaphore) +#else +#define _SDT_SEMAPHORE(p,n) _SDT_ASM_1( _SDT_ASM_ADDR 0) +#endif + +#define _SDT_ASM_TEMPLATE_0 /* no arguments */ +#define _SDT_ASM_TEMPLATE_1 _SDT_ARGFMT(1) +#define _SDT_ASM_TEMPLATE_2 _SDT_ASM_TEMPLATE_1 _SDT_ARGFMT(2) +#define _SDT_ASM_TEMPLATE_3 _SDT_ASM_TEMPLATE_2 _SDT_ARGFMT(3) +#define _SDT_ASM_TEMPLATE_4 _SDT_ASM_TEMPLATE_3 _SDT_ARGFMT(4) +#define _SDT_ASM_TEMPLATE_5 _SDT_ASM_TEMPLATE_4 _SDT_ARGFMT(5) +#define _SDT_ASM_TEMPLATE_6 _SDT_ASM_TEMPLATE_5 _SDT_ARGFMT(6) +#define _SDT_ASM_TEMPLATE_7 _SDT_ASM_TEMPLATE_6 _SDT_ARGFMT(7) +#define _SDT_ASM_TEMPLATE_8 _SDT_ASM_TEMPLATE_7 _SDT_ARGFMT(8) +#define _SDT_ASM_TEMPLATE_9 _SDT_ASM_TEMPLATE_8 _SDT_ARGFMT(9) +#define _SDT_ASM_TEMPLATE_10 _SDT_ASM_TEMPLATE_9 _SDT_ARGFMT(10) +#define _SDT_ASM_TEMPLATE_11 _SDT_ASM_TEMPLATE_10 _SDT_ARGFMT(11) +#define _SDT_ASM_TEMPLATE_12 _SDT_ASM_TEMPLATE_11 _SDT_ARGFMT(12) +#define _SDT_ASM_OPERANDS_0() [__sdt_dummy] "g" (0) +#define _SDT_ASM_OPERANDS_1(arg1) _SDT_ARG(1, arg1) +#define _SDT_ASM_OPERANDS_2(arg1, arg2) \ + _SDT_ASM_OPERANDS_1(arg1), _SDT_ARG(2, arg2) +#define _SDT_ASM_OPERANDS_3(arg1, arg2, arg3) \ + _SDT_ASM_OPERANDS_2(arg1, arg2), _SDT_ARG(3, arg3) +#define _SDT_ASM_OPERANDS_4(arg1, arg2, arg3, arg4) \ + _SDT_ASM_OPERANDS_3(arg1, arg2, arg3), _SDT_ARG(4, arg4) +#define _SDT_ASM_OPERANDS_5(arg1, arg2, arg3, arg4, arg5) \ + _SDT_ASM_OPERANDS_4(arg1, arg2, arg3, arg4), _SDT_ARG(5, arg5) +#define _SDT_ASM_OPERANDS_6(arg1, arg2, arg3, arg4, arg5, arg6) \ + _SDT_ASM_OPERANDS_5(arg1, arg2, arg3, arg4, arg5), _SDT_ARG(6, arg6) +#define _SDT_ASM_OPERANDS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + _SDT_ASM_OPERANDS_6(arg1, arg2, arg3, arg4, arg5, arg6), _SDT_ARG(7, arg7) +#define _SDT_ASM_OPERANDS_8(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ + _SDT_ASM_OPERANDS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7), \ + _SDT_ARG(8, arg8) +#define _SDT_ASM_OPERANDS_9(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) \ + _SDT_ASM_OPERANDS_8(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8), \ + _SDT_ARG(9, arg9) +#define _SDT_ASM_OPERANDS_10(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) \ + _SDT_ASM_OPERANDS_9(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9), \ + _SDT_ARG(10, arg10) +#define _SDT_ASM_OPERANDS_11(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11) \ + _SDT_ASM_OPERANDS_10(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10), \ + _SDT_ARG(11, arg11) +#define _SDT_ASM_OPERANDS_12(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12) \ + _SDT_ASM_OPERANDS_11(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11), \ + _SDT_ARG(12, arg12) + +/* These macros can be used in C, C++, or assembly code. + In assembly code the arguments should use normal assembly operand syntax. */ + +#define STAP_PROBE(provider, name) \ + _SDT_PROBE(provider, name, 0, ()) +#define STAP_PROBE1(provider, name, arg1) \ + _SDT_PROBE(provider, name, 1, (arg1)) +#define STAP_PROBE2(provider, name, arg1, arg2) \ + _SDT_PROBE(provider, name, 2, (arg1, arg2)) +#define STAP_PROBE3(provider, name, arg1, arg2, arg3) \ + _SDT_PROBE(provider, name, 3, (arg1, arg2, arg3)) +#define STAP_PROBE4(provider, name, arg1, arg2, arg3, arg4) \ + _SDT_PROBE(provider, name, 4, (arg1, arg2, arg3, arg4)) +#define STAP_PROBE5(provider, name, arg1, arg2, arg3, arg4, arg5) \ + _SDT_PROBE(provider, name, 5, (arg1, arg2, arg3, arg4, arg5)) +#define STAP_PROBE6(provider, name, arg1, arg2, arg3, arg4, arg5, arg6) \ + _SDT_PROBE(provider, name, 6, (arg1, arg2, arg3, arg4, arg5, arg6)) +#define STAP_PROBE7(provider, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + _SDT_PROBE(provider, name, 7, (arg1, arg2, arg3, arg4, arg5, arg6, arg7)) +#define STAP_PROBE8(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) \ + _SDT_PROBE(provider, name, 8, (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) +#define STAP_PROBE9(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)\ + _SDT_PROBE(provider, name, 9, (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)) +#define STAP_PROBE10(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) \ + _SDT_PROBE(provider, name, 10, \ + (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10)) +#define STAP_PROBE11(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11) \ + _SDT_PROBE(provider, name, 11, \ + (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)) +#define STAP_PROBE12(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12) \ + _SDT_PROBE(provider, name, 12, \ + (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12)) + +/* This STAP_PROBEV macro can be used in variadic scenarios, where the + number of probe arguments is not known until compile time. Since + variadic macro support may vary with compiler options, you must + pre-#define SDT_USE_VARIADIC to enable this type of probe. + + The trick to count __VA_ARGS__ was inspired by this post by + Laurent Deniau <laurent.deniau@cern.ch>: + http://groups.google.com/group/comp.std.c/msg/346fc464319b1ee5 + + Note that our _SDT_NARG is called with an extra 0 arg that's not + counted, so we don't have to worry about the behavior of macros + called without any arguments. */ + +#ifdef SDT_USE_VARIADIC +#define _SDT_NARG(...) __SDT_NARG(__VA_ARGS__, 12,11,10,9,8,7,6,5,4,3,2,1,0) +#define __SDT_NARG(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12, N, ...) N +#define _SDT_PROBE_N(provider, name, N, ...) \ + _SDT_PROBE(provider, name, N, (__VA_ARGS__)) +#define STAP_PROBEV(provider, name, ...) \ + _SDT_PROBE_N(provider, name, _SDT_NARG(0, ##__VA_ARGS__), ##__VA_ARGS__) +#endif + +/* These macros are for use in asm statements. You must compile + with -std=gnu99 or -std=c99 to use the STAP_PROBE_ASM macro. + + The STAP_PROBE_ASM macro generates a quoted string to be used in the + template portion of the asm statement, concatenated with strings that + contain the actual assembly code around the probe site. + + For example: + + asm ("before\n" + STAP_PROBE_ASM(provider, fooprobe, %eax 4(%esi)) + "after"); + + emits the assembly code for "before\nafter", with a probe in between. + The probe arguments are the %eax register, and the value of the memory + word located 4 bytes past the address in the %esi register. Note that + because this is a simple asm, not a GNU C extended asm statement, these + % characters do not need to be doubled to generate literal %reg names. + + In a GNU C extended asm statement, the probe arguments can be specified + using the macro STAP_PROBE_ASM_TEMPLATE(n) for n arguments. The paired + macro STAP_PROBE_ASM_OPERANDS gives the C values of these probe arguments, + and appears in the input operand list of the asm statement. For example: + + asm ("someinsn %0,%1\n" // %0 is output operand, %1 is input operand + STAP_PROBE_ASM(provider, fooprobe, STAP_PROBE_ASM_TEMPLATE(3)) + "otherinsn %[namedarg]" + : "r" (outvar) + : "g" (some_value), [namedarg] "i" (1234), + STAP_PROBE_ASM_OPERANDS(3, some_value, some_ptr->field, 1234)); + + This is just like writing: + + STAP_PROBE3(provider, fooprobe, some_value, some_ptr->field, 1234)); + + but the probe site is right between "someinsn" and "otherinsn". + + The probe arguments in STAP_PROBE_ASM can be given as assembly + operands instead, even inside a GNU C extended asm statement. + Note that these can use operand templates like %0 or %[name], + and likewise they must write %%reg for a literal operand of %reg. */ + +#if __STDC_VERSION__ >= 199901L +# define STAP_PROBE_ASM(provider, name, ...) \ + _SDT_ASM_BODY(provider, name, _SDT_ASM_STRING, (__VA_ARGS__)) \ + _SDT_ASM_BASE +# define STAP_PROBE_ASM_OPERANDS(n, ...) _SDT_ASM_OPERANDS_##n(__VA_ARGS__) +#else +# define STAP_PROBE_ASM(provider, name, args) \ + _SDT_ASM_BODY(provider, name, _SDT_ASM_STRING, (args)) \ + _SDT_ASM_BASE +#endif +#define STAP_PROBE_ASM_TEMPLATE(n) _SDT_ASM_TEMPLATE_##n + + +/* DTrace compatible macro names. */ +#define DTRACE_PROBE(provider,probe) \ + STAP_PROBE(provider,probe) +#define DTRACE_PROBE1(provider,probe,parm1) \ + STAP_PROBE1(provider,probe,parm1) +#define DTRACE_PROBE2(provider,probe,parm1,parm2) \ + STAP_PROBE2(provider,probe,parm1,parm2) +#define DTRACE_PROBE3(provider,probe,parm1,parm2,parm3) \ + STAP_PROBE3(provider,probe,parm1,parm2,parm3) +#define DTRACE_PROBE4(provider,probe,parm1,parm2,parm3,parm4) \ + STAP_PROBE4(provider,probe,parm1,parm2,parm3,parm4) +#define DTRACE_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5) \ + STAP_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5) +#define DTRACE_PROBE6(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6) \ + STAP_PROBE6(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6) +#define DTRACE_PROBE7(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7) \ + STAP_PROBE7(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7) +#define DTRACE_PROBE8(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8) \ + STAP_PROBE8(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8) +#define DTRACE_PROBE9(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9) \ + STAP_PROBE9(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9) +#define DTRACE_PROBE10(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10) \ + STAP_PROBE10(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10) +#define DTRACE_PROBE11(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11) \ + STAP_PROBE11(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11) +#define DTRACE_PROBE12(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11,parm12) \ + STAP_PROBE12(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11,parm12) + + +#endif /* sys/sdt.h */ |