1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

slotinfo in struct dtv_slotinfo_list should be flexible array [BZ #25097]

GCC 10 will warn about subscribing inner length zero arrays.  Use a GCC
extension in csu/libc-tls.c to allocate space for the static_slotinfo
variable.  Adjust nptl_db so that the type description machinery does
not attempt to determine the size of the flexible array member slotinfo.

Change-Id: I51be146a7857186a4ede0bb40b332509487bdde8
This commit is contained in:
Florian Weimer
2019-11-12 12:41:34 +01:00
parent 42b926d303
commit cba932a5a9
6 changed files with 29 additions and 22 deletions

View File

@ -23,7 +23,7 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/param.h>
#include <array_length.h>
#ifdef SHARED
#error makefile bug, this file is for static only
@ -32,17 +32,11 @@
dtv_t _dl_static_dtv[2 + TLS_SLOTINFO_SURPLUS];
static struct
{
struct dtv_slotinfo_list si;
/* The dtv_slotinfo_list data structure does not include the actual
information since it is defined as an array of size zero. We define
here the necessary entries. Note that it is not important whether
there is padding or not since we will always access the information
through the 'si' element. */
struct dtv_slotinfo info[2 + TLS_SLOTINFO_SURPLUS];
} static_slotinfo;
static struct dtv_slotinfo_list static_slotinfo =
{
/* Allocate an array of 2 + TLS_SLOTINFO_SURPLUS elements. */
.slotinfo = { [array_length (_dl_static_dtv) - 1] = { 0 } },
};
/* Highest dtv index currently needed. */
size_t _dl_tls_max_dtv_idx;
@ -72,16 +66,16 @@ TLS_INIT_HELPER
static void
init_slotinfo (void)
{
/* Create the slotinfo list. */
static_slotinfo.si.len = (((char *) (&static_slotinfo + 1)
- (char *) &static_slotinfo.si.slotinfo[0])
/ sizeof static_slotinfo.si.slotinfo[0]);
// static_slotinfo.si.next = NULL; already zero
/* Create the slotinfo list. Note that the type of static_slotinfo
has effectively a zero-length array, so we cannot use the size of
static_slotinfo to determine the array length. */
static_slotinfo.len = array_length (_dl_static_dtv);
/* static_slotinfo.next = NULL; -- Already zero. */
/* The slotinfo list. Will be extended by the code doing dynamic
linking. */
GL(dl_tls_max_dtv_idx) = 1;
GL(dl_tls_dtv_slotinfo_list) = &static_slotinfo.si;
GL(dl_tls_dtv_slotinfo_list) = &static_slotinfo;
}
static void
@ -205,8 +199,8 @@ __libc_setup_tls (void)
main_map->l_tls_modid = 1;
init_slotinfo ();
// static_slotinfo.si.slotinfo[1].gen = 0; already zero
static_slotinfo.si.slotinfo[1].map = main_map;
/* static_slotinfo.slotinfo[1].gen = 0; -- Already zero. */
static_slotinfo.slotinfo[1].map = main_map;
memsz = roundup (memsz, align ?: 1);