parent
194c2881ac
commit
faf38262bf
41
glibc-upstream-2.34-34.patch
Normal file
41
glibc-upstream-2.34-34.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
commit 558168c78ea1eb8efb33959c1da9d6b5a997fd7b
|
||||||
|
Author: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Date: Wed Oct 6 21:48:35 2021 +0530
|
||||||
|
|
||||||
|
support: Also return fd when it is 0
|
||||||
|
|
||||||
|
The fd validity check in open_dev_null checks if fd > 0, which would
|
||||||
|
lead to a leaked fd if it is == 0.
|
||||||
|
|
||||||
|
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
(cherry picked from commit 27b6edbb090f736b101f569620d8ad0e7217ddf8)
|
||||||
|
|
||||||
|
diff --git a/support/support-open-dev-null-range.c b/support/support-open-dev-null-range.c
|
||||||
|
index 80d9dba50402ce12..66a850410557351b 100644
|
||||||
|
--- a/support/support-open-dev-null-range.c
|
||||||
|
+++ b/support/support-open-dev-null-range.c
|
||||||
|
@@ -40,16 +40,16 @@ increase_nofile (void)
|
||||||
|
static int
|
||||||
|
open_dev_null (int flags, mode_t mode)
|
||||||
|
{
|
||||||
|
- int fd = open64 ("/dev/null", flags, mode);
|
||||||
|
- if (fd > 0)
|
||||||
|
- return fd;
|
||||||
|
+ int fd = open64 ("/dev/null", flags, mode);
|
||||||
|
+ if (fd >= 0)
|
||||||
|
+ return fd;
|
||||||
|
|
||||||
|
- if (fd < 0 && errno != EMFILE)
|
||||||
|
- FAIL_EXIT1 ("open64 (\"/dev/null\", 0x%x, 0%o): %m", flags, mode);
|
||||||
|
+ if (fd < 0 && errno != EMFILE)
|
||||||
|
+ FAIL_EXIT1 ("open64 (\"/dev/null\", 0x%x, 0%o): %m", flags, mode);
|
||||||
|
|
||||||
|
- increase_nofile ();
|
||||||
|
+ increase_nofile ();
|
||||||
|
|
||||||
|
- return xopen ("/dev/null", flags, mode);
|
||||||
|
+ return xopen ("/dev/null", flags, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct range
|
83
glibc-upstream-2.34-35.patch
Normal file
83
glibc-upstream-2.34-35.patch
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
commit cb44a620ef2336449af60694b6696efced161774
|
||||||
|
Author: Stefan Liebler <stli@linux.ibm.com>
|
||||||
|
Date: Tue Oct 5 16:14:10 2021 +0200
|
||||||
|
|
||||||
|
S390: Add PCI_MIO and SIE HWCAPs
|
||||||
|
|
||||||
|
Both new HWCAPs were introduced in these kernel commits:
|
||||||
|
- 7e8403ecaf884f307b627f3c371475913dd29292
|
||||||
|
"s390: add HWCAP_S390_PCI_MIO to ELF hwcaps"
|
||||||
|
- 7e82523f2583e9813e4109df3656707162541297
|
||||||
|
"s390/hwcaps: make sie capability regular hwcap"
|
||||||
|
|
||||||
|
Also note that the kernel commit 511ad531afd4090625def4d9aba1f5227bd44b8e
|
||||||
|
"s390/hwcaps: shorten HWCAP defines" has shortened the prefix of the macros
|
||||||
|
from "HWCAP_S390_" to "HWCAP_". For compatibility reasons, we do not
|
||||||
|
change the prefix in public glibc header file.
|
||||||
|
|
||||||
|
(cherry picked from commit f2e06656d04a9fcb0603802a4f8ce7aa3a1f055e)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/s390/dl-procinfo.c b/sysdeps/s390/dl-procinfo.c
|
||||||
|
index c174e27b3559c57c..155f0bd99eccb3f9 100644
|
||||||
|
--- a/sysdeps/s390/dl-procinfo.c
|
||||||
|
+++ b/sysdeps/s390/dl-procinfo.c
|
||||||
|
@@ -46,13 +46,13 @@
|
||||||
|
#if !defined PROCINFO_DECL && defined SHARED
|
||||||
|
._dl_s390_cap_flags
|
||||||
|
#else
|
||||||
|
-PROCINFO_CLASS const char _dl_s390_cap_flags[21][9]
|
||||||
|
+PROCINFO_CLASS const char _dl_s390_cap_flags[23][9]
|
||||||
|
#endif
|
||||||
|
#ifndef PROCINFO_DECL
|
||||||
|
= {
|
||||||
|
"esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", "edat", "etf3eh",
|
||||||
|
"highgprs", "te", "vx", "vxd", "vxe", "gs", "vxe2", "vxp", "sort", "dflt",
|
||||||
|
- "vxp2", "nnpa"
|
||||||
|
+ "vxp2", "nnpa", "pcimio", "sie"
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if !defined SHARED || defined PROCINFO_DECL
|
||||||
|
diff --git a/sysdeps/s390/dl-procinfo.h b/sysdeps/s390/dl-procinfo.h
|
||||||
|
index 2d9c3058083e5dda..e4e3e334a5b3d47c 100644
|
||||||
|
--- a/sysdeps/s390/dl-procinfo.h
|
||||||
|
+++ b/sysdeps/s390/dl-procinfo.h
|
||||||
|
@@ -21,7 +21,7 @@
|
||||||
|
#define _DL_PROCINFO_H 1
|
||||||
|
#include <ldsodefs.h>
|
||||||
|
|
||||||
|
-#define _DL_HWCAP_COUNT 21
|
||||||
|
+#define _DL_HWCAP_COUNT 23
|
||||||
|
|
||||||
|
#define _DL_PLATFORMS_COUNT 10
|
||||||
|
|
||||||
|
@@ -63,6 +63,8 @@ enum
|
||||||
|
HWCAP_S390_DFLT = 1 << 18,
|
||||||
|
HWCAP_S390_VXRS_PDE2 = 1 << 19,
|
||||||
|
HWCAP_S390_NNPA = 1 << 20,
|
||||||
|
+ HWCAP_S390_PCI_MIO = 1 << 21,
|
||||||
|
+ HWCAP_S390_SIE = 1 << 22,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define HWCAP_IMPORTANT (HWCAP_S390_ZARCH | HWCAP_S390_LDISP \
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/s390/bits/hwcap.h b/sysdeps/unix/sysv/linux/s390/bits/hwcap.h
|
||||||
|
index e9bd3684db862d1b..00e73a3e3bfdb711 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/s390/bits/hwcap.h
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/s390/bits/hwcap.h
|
||||||
|
@@ -22,6 +22,11 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following must match the kernels asm/elf.h.
|
||||||
|
+ * Note: The kernel commit 511ad531afd4090625def4d9aba1f5227bd44b8e
|
||||||
|
+ * "s390/hwcaps: shorten HWCAP defines" has shortened the prefix of the macros
|
||||||
|
+ * from "HWCAP_S390_" to "HWCAP_". For compatibility reasons, we do not
|
||||||
|
+ * change the prefix in public glibc header file.
|
||||||
|
+ *
|
||||||
|
* Note that these are *not* the same as the STORE FACILITY LIST bits.
|
||||||
|
*/
|
||||||
|
#define HWCAP_S390_ESAN3 1
|
||||||
|
@@ -48,3 +53,5 @@
|
||||||
|
#define HWCAP_S390_DFLT 262144
|
||||||
|
#define HWCAP_S390_VXRS_PDE2 524288
|
||||||
|
#define HWCAP_S390_NNPA 1048576
|
||||||
|
+#define HWCAP_S390_PCI_MIO 2097152
|
||||||
|
+#define HWCAP_S390_SIE 4194304
|
47
glibc-upstream-2.34-36.patch
Normal file
47
glibc-upstream-2.34-36.patch
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
commit 79528414dc1578800cbf1fba2fbdb6335f4f39bf
|
||||||
|
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||||
|
Date: Thu Sep 30 10:29:17 2021 -0700
|
||||||
|
|
||||||
|
elf: Replace nsid with args.nsid [BZ #27609]
|
||||||
|
|
||||||
|
commit ec935dea6332cb22f9881cd1162bad156173f4b0
|
||||||
|
Author: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Date: Fri Apr 24 22:31:15 2020 +0200
|
||||||
|
|
||||||
|
elf: Implement __libc_early_init
|
||||||
|
|
||||||
|
has
|
||||||
|
|
||||||
|
@@ -856,6 +876,11 @@ no more namespaces available for dlmopen()"));
|
||||||
|
/* See if an error occurred during loading. */
|
||||||
|
if (__glibc_unlikely (exception.errstring != NULL))
|
||||||
|
{
|
||||||
|
+ /* Avoid keeping around a dangling reference to the libc.so link
|
||||||
|
+ map in case it has been cached in libc_map. */
|
||||||
|
+ if (!args.libc_already_loaded)
|
||||||
|
+ GL(dl_ns)[nsid].libc_map = NULL;
|
||||||
|
+
|
||||||
|
|
||||||
|
do_dlopen calls _dl_open with nsid == __LM_ID_CALLER (-2), which calls
|
||||||
|
dl_open_worker with args.nsid = nsid. dl_open_worker updates args.nsid
|
||||||
|
if it is __LM_ID_CALLER. After dl_open_worker returns, it is wrong to
|
||||||
|
use nsid.
|
||||||
|
|
||||||
|
Replace nsid with args.nsid after dl_open_worker returns. This fixes
|
||||||
|
BZ #27609.
|
||||||
|
|
||||||
|
(cherry picked from commit 1e1ecea62e899acb58c3fdf3b320a0833ddd0dff)
|
||||||
|
|
||||||
|
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||||
|
index ec386626f96e17f7..41c7250bf630f978 100644
|
||||||
|
--- a/elf/dl-open.c
|
||||||
|
+++ b/elf/dl-open.c
|
||||||
|
@@ -886,7 +886,7 @@ no more namespaces available for dlmopen()"));
|
||||||
|
/* Avoid keeping around a dangling reference to the libc.so link
|
||||||
|
map in case it has been cached in libc_map. */
|
||||||
|
if (!args.libc_already_loaded)
|
||||||
|
- GL(dl_ns)[nsid].libc_map = NULL;
|
||||||
|
+ GL(dl_ns)[args.nsid].libc_map = NULL;
|
||||||
|
|
||||||
|
/* Remove the object from memory. It may be in an inconsistent
|
||||||
|
state if relocation failed, for example. */
|
137
glibc-upstream-2.34-37.patch
Normal file
137
glibc-upstream-2.34-37.patch
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
commit 76843f3b3ecb886b8d300220e6ec378e0fd09a8b
|
||||||
|
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
Date: Wed Oct 6 08:10:13 2021 -0300
|
||||||
|
|
||||||
|
y2038: Use a common definition for stat for sparc32
|
||||||
|
|
||||||
|
The sparc32 misses support for support done by 4e8521333bea6.
|
||||||
|
|
||||||
|
Checked on sparcv9-linux-gnu.
|
||||||
|
|
||||||
|
(cherry picked from commit d2b1254db208b35ff060f00a15f22a1eed5306d2)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/struct_stat.h b/sysdeps/unix/sysv/linux/sparc/bits/struct_stat.h
|
||||||
|
index b481b4f9f80a94f4..45db6b6ffbb19b8b 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/sparc/bits/struct_stat.h
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/sparc/bits/struct_stat.h
|
||||||
|
@@ -28,32 +28,35 @@
|
||||||
|
|
||||||
|
struct stat
|
||||||
|
{
|
||||||
|
+#ifdef __USE_TIME_BITS64
|
||||||
|
+# include <bits/struct_stat_time64_helper.h>
|
||||||
|
+#else
|
||||||
|
__dev_t st_dev; /* Device. */
|
||||||
|
-#if __WORDSIZE == 64 || !defined __USE_FILE_OFFSET64
|
||||||
|
+# if __WORDSIZE == 64 || !defined __USE_FILE_OFFSET64
|
||||||
|
unsigned short int __pad1;
|
||||||
|
__ino_t st_ino; /* File serial number. */
|
||||||
|
-#else
|
||||||
|
+# else
|
||||||
|
__ino64_t st_ino; /* File serial number. */
|
||||||
|
-#endif
|
||||||
|
+# endif
|
||||||
|
__mode_t st_mode; /* File mode. */
|
||||||
|
__nlink_t st_nlink; /* Link count. */
|
||||||
|
__uid_t st_uid; /* User ID of the file's owner. */
|
||||||
|
__gid_t st_gid; /* Group ID of the file's group.*/
|
||||||
|
__dev_t st_rdev; /* Device number, if device. */
|
||||||
|
unsigned short int __pad2;
|
||||||
|
-#ifndef __USE_FILE_OFFSET64
|
||||||
|
+# ifndef __USE_FILE_OFFSET64
|
||||||
|
__off_t st_size; /* Size of file, in bytes. */
|
||||||
|
-#else
|
||||||
|
+# else
|
||||||
|
__off64_t st_size; /* Size of file, in bytes. */
|
||||||
|
-#endif
|
||||||
|
+# endif
|
||||||
|
__blksize_t st_blksize; /* Optimal block size for I/O. */
|
||||||
|
|
||||||
|
-#ifndef __USE_FILE_OFFSET64
|
||||||
|
+# ifndef __USE_FILE_OFFSET64
|
||||||
|
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
|
||||||
|
-#else
|
||||||
|
+# else
|
||||||
|
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
|
||||||
|
-#endif
|
||||||
|
-#ifdef __USE_XOPEN2K8
|
||||||
|
+# endif
|
||||||
|
+# ifdef __USE_XOPEN2K8
|
||||||
|
/* Nanosecond resolution timestamps are stored in a format
|
||||||
|
equivalent to 'struct timespec'. This is the type used
|
||||||
|
whenever possible but the Unix namespace rules do not allow the
|
||||||
|
@@ -63,28 +66,32 @@ struct stat
|
||||||
|
struct timespec st_atim; /* Time of last access. */
|
||||||
|
struct timespec st_mtim; /* Time of last modification. */
|
||||||
|
struct timespec st_ctim; /* Time of last status change. */
|
||||||
|
-# define st_atime st_atim.tv_sec /* Backward compatibility. */
|
||||||
|
-# define st_mtime st_mtim.tv_sec
|
||||||
|
-# define st_ctime st_ctim.tv_sec
|
||||||
|
-#else
|
||||||
|
+# define st_atime st_atim.tv_sec /* Backward compatibility. */
|
||||||
|
+# define st_mtime st_mtim.tv_sec
|
||||||
|
+# define st_ctime st_ctim.tv_sec
|
||||||
|
+# else
|
||||||
|
__time_t st_atime; /* Time of last access. */
|
||||||
|
unsigned long int st_atimensec; /* Nscecs of last access. */
|
||||||
|
__time_t st_mtime; /* Time of last modification. */
|
||||||
|
unsigned long int st_mtimensec; /* Nsecs of last modification. */
|
||||||
|
__time_t st_ctime; /* Time of last status change. */
|
||||||
|
unsigned long int st_ctimensec; /* Nsecs of last status change. */
|
||||||
|
-#endif
|
||||||
|
+# endif
|
||||||
|
unsigned long int __glibc_reserved4;
|
||||||
|
unsigned long int __glibc_reserved5;
|
||||||
|
+#endif /* __USE_TIME_BITS64 */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
struct stat64
|
||||||
|
{
|
||||||
|
+# ifdef __USE_TIME_BITS64
|
||||||
|
+# include <bits/struct_stat_time64_helper.h>
|
||||||
|
+# else
|
||||||
|
__dev_t st_dev; /* Device. */
|
||||||
|
-# if __WORDSIZE == 64
|
||||||
|
+# if __WORDSIZE == 64
|
||||||
|
unsigned short int __pad1;
|
||||||
|
-# endif
|
||||||
|
+# endif
|
||||||
|
__ino64_t st_ino; /* File serial number. */
|
||||||
|
__mode_t st_mode; /* File mode. */
|
||||||
|
__nlink_t st_nlink; /* Link count. */
|
||||||
|
@@ -96,7 +103,7 @@ struct stat64
|
||||||
|
__blksize_t st_blksize; /* Optimal block size for I/O. */
|
||||||
|
|
||||||
|
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
|
||||||
|
-# ifdef __USE_XOPEN2K8
|
||||||
|
+# ifdef __USE_XOPEN2K8
|
||||||
|
/* Nanosecond resolution timestamps are stored in a format
|
||||||
|
equivalent to 'struct timespec'. This is the type used
|
||||||
|
whenever possible but the Unix namespace rules do not allow the
|
||||||
|
@@ -106,19 +113,20 @@ struct stat64
|
||||||
|
struct timespec st_atim; /* Time of last access. */
|
||||||
|
struct timespec st_mtim; /* Time of last modification. */
|
||||||
|
struct timespec st_ctim; /* Time of last status change. */
|
||||||
|
-# define st_atime st_atim.tv_sec /* Backward compatibility. */
|
||||||
|
-# define st_mtime st_mtim.tv_sec
|
||||||
|
-# define st_ctime st_ctim.tv_sec
|
||||||
|
-# else
|
||||||
|
+# define st_atime st_atim.tv_sec /* Backward compatibility. */
|
||||||
|
+# define st_mtime st_mtim.tv_sec
|
||||||
|
+# define st_ctime st_ctim.tv_sec
|
||||||
|
+# else
|
||||||
|
__time_t st_atime; /* Time of last access. */
|
||||||
|
unsigned long int st_atimensec; /* Nscecs of last access. */
|
||||||
|
__time_t st_mtime; /* Time of last modification. */
|
||||||
|
unsigned long int st_mtimensec; /* Nsecs of last modification. */
|
||||||
|
__time_t st_ctime; /* Time of last status change. */
|
||||||
|
unsigned long int st_ctimensec; /* Nsecs of last status change. */
|
||||||
|
-# endif
|
||||||
|
+# endif
|
||||||
|
unsigned long int __glibc_reserved4;
|
||||||
|
unsigned long int __glibc_reserved5;
|
||||||
|
+# endif /* __USE_TIME_BITS64 */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
41
glibc-upstream-2.34-38.patch
Normal file
41
glibc-upstream-2.34-38.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
commit cb9b8b5d7670df1a13544857640efd86a299d0e4
|
||||||
|
Author: Stafford Horne <shorne@gmail.com>
|
||||||
|
Date: Fri Oct 15 06:17:41 2021 +0900
|
||||||
|
|
||||||
|
timex: Use 64-bit fields on 32-bit TIMESIZE=64 systems (BZ #28469)
|
||||||
|
|
||||||
|
This was found when testing the OpenRISC port I am working on. These
|
||||||
|
two tests fail with SIGSEGV:
|
||||||
|
|
||||||
|
FAIL: misc/tst-ntp_gettime
|
||||||
|
FAIL: misc/tst-ntp_gettimex
|
||||||
|
|
||||||
|
This was found to be due to the kernel overwriting the stack space
|
||||||
|
allocated by the timex structure. The reason for the overwrite being
|
||||||
|
that the kernel timex has 64-bit fields and user space code only
|
||||||
|
allocates enough stack space for timex with 32-bit fields.
|
||||||
|
|
||||||
|
On 32-bit systems with TIMESIZE=64 __USE_TIME_BITS64 is not defined.
|
||||||
|
This causes the timex structure to use 32-bit fields with type
|
||||||
|
__syscall_slong_t.
|
||||||
|
|
||||||
|
This patch adjusts the ifdef condition to allow 32-bit systems with
|
||||||
|
TIMESIZE=64 to use the 64-bit long long timex definition.
|
||||||
|
|
||||||
|
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
|
||||||
|
(Cherry picked from commit 1d550265a75b412cea4889a50b101395f6a8e025)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/bits/timex.h b/sysdeps/unix/sysv/linux/bits/timex.h
|
||||||
|
index ee37694e8f09a8e4..4a5db6deca10de58 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/bits/timex.h
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/bits/timex.h
|
||||||
|
@@ -25,7 +25,7 @@
|
||||||
|
|
||||||
|
struct timex
|
||||||
|
{
|
||||||
|
-# ifdef __USE_TIME_BITS64
|
||||||
|
+# if defined __USE_TIME_BITS64 || (__TIMESIZE == 64 && __WORDSIZE == 32)
|
||||||
|
unsigned int modes; /* mode selector */
|
||||||
|
int :32; /* pad */
|
||||||
|
long long offset; /* time offset (usec) */
|
466
glibc-upstream-2.34-39.patch
Normal file
466
glibc-upstream-2.34-39.patch
Normal file
@ -0,0 +1,466 @@
|
|||||||
|
commit 024a7640ab9ecea80e527f4e4d7f7a1868e952c5
|
||||||
|
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||||
|
Date: Wed Sep 15 15:16:19 2021 +0100
|
||||||
|
|
||||||
|
elf: Avoid deadlock between pthread_create and ctors [BZ #28357]
|
||||||
|
|
||||||
|
The fix for bug 19329 caused a regression such that pthread_create can
|
||||||
|
deadlock when concurrent ctors from dlopen are waiting for it to finish.
|
||||||
|
Use a new GL(dl_load_tls_lock) in pthread_create that is not taken
|
||||||
|
around ctors in dlopen.
|
||||||
|
|
||||||
|
The new lock is also used in __tls_get_addr instead of GL(dl_load_lock).
|
||||||
|
|
||||||
|
The new lock is held in _dl_open_worker and _dl_close_worker around
|
||||||
|
most of the logic before/after the init/fini routines. When init/fini
|
||||||
|
routines are running then TLS is in a consistent, usable state.
|
||||||
|
In _dl_open_worker the new lock requires catching and reraising dlopen
|
||||||
|
failures that happen in the critical section.
|
||||||
|
|
||||||
|
The new lock is reinitialized in a fork child, to keep the existing
|
||||||
|
behaviour and it is kept recursive in case malloc interposition or TLS
|
||||||
|
access from signal handlers can retake it. It is not obvious if this
|
||||||
|
is necessary or helps, but avoids changing the preexisting behaviour.
|
||||||
|
|
||||||
|
The new lock may be more appropriate for dl_iterate_phdr too than
|
||||||
|
GL(dl_load_write_lock), since TLS state of an incompletely loaded
|
||||||
|
module may be accessed. If the new lock can replace the old one,
|
||||||
|
that can be a separate change.
|
||||||
|
|
||||||
|
Fixes bug 28357.
|
||||||
|
|
||||||
|
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
(cherry picked from commit 83b5323261bb72313bffcf37476c1b8f0847c736)
|
||||||
|
|
||||||
|
diff --git a/elf/dl-close.c b/elf/dl-close.c
|
||||||
|
index f39001cab981b723..cd7b9c9fe83a1a44 100644
|
||||||
|
--- a/elf/dl-close.c
|
||||||
|
+++ b/elf/dl-close.c
|
||||||
|
@@ -549,6 +549,9 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||||
|
size_t tls_free_end;
|
||||||
|
tls_free_start = tls_free_end = NO_TLS_OFFSET;
|
||||||
|
|
||||||
|
+ /* Protects global and module specitic TLS state. */
|
||||||
|
+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
|
||||||
|
+
|
||||||
|
/* We modify the list of loaded objects. */
|
||||||
|
__rtld_lock_lock_recursive (GL(dl_load_write_lock));
|
||||||
|
|
||||||
|
@@ -784,6 +787,9 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||||
|
GL(dl_tls_static_used) = tls_free_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* TLS is cleaned up for the unloaded modules. */
|
||||||
|
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||||
|
+
|
||||||
|
#ifdef SHARED
|
||||||
|
/* Auditing checkpoint: we have deleted all objects. */
|
||||||
|
if (__glibc_unlikely (do_audit))
|
||||||
|
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||||
|
index 41c7250bf630f978..bc68e2c376debd71 100644
|
||||||
|
--- a/elf/dl-open.c
|
||||||
|
+++ b/elf/dl-open.c
|
||||||
|
@@ -66,6 +66,9 @@ struct dl_open_args
|
||||||
|
libc_map value in the namespace in case of a dlopen failure. */
|
||||||
|
bool libc_already_loaded;
|
||||||
|
|
||||||
|
+ /* Set to true if the end of dl_open_worker_begin was reached. */
|
||||||
|
+ bool worker_continue;
|
||||||
|
+
|
||||||
|
/* Original parameters to the program and the current environment. */
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
@@ -482,7 +485,7 @@ call_dl_init (void *closure)
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-dl_open_worker (void *a)
|
||||||
|
+dl_open_worker_begin (void *a)
|
||||||
|
{
|
||||||
|
struct dl_open_args *args = a;
|
||||||
|
const char *file = args->file;
|
||||||
|
@@ -774,6 +777,36 @@ dl_open_worker (void *a)
|
||||||
|
_dl_call_libc_early_init (libc_map, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ args->worker_continue = true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+dl_open_worker (void *a)
|
||||||
|
+{
|
||||||
|
+ struct dl_open_args *args = a;
|
||||||
|
+
|
||||||
|
+ args->worker_continue = false;
|
||||||
|
+
|
||||||
|
+ {
|
||||||
|
+ /* Protects global and module specific TLS state. */
|
||||||
|
+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
|
||||||
|
+
|
||||||
|
+ struct dl_exception ex;
|
||||||
|
+ int err = _dl_catch_exception (&ex, dl_open_worker_begin, args);
|
||||||
|
+
|
||||||
|
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||||
|
+
|
||||||
|
+ if (__glibc_unlikely (ex.errstring != NULL))
|
||||||
|
+ /* Reraise the error. */
|
||||||
|
+ _dl_signal_exception (err, &ex, NULL);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!args->worker_continue)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ int mode = args->mode;
|
||||||
|
+ struct link_map *new = args->map;
|
||||||
|
+
|
||||||
|
/* Run the initializer functions of new objects. Temporarily
|
||||||
|
disable the exception handler, so that lazy binding failures are
|
||||||
|
fatal. */
|
||||||
|
diff --git a/elf/dl-support.c b/elf/dl-support.c
|
||||||
|
index 01557181753fb38d..d8c06ba7eb4c76ea 100644
|
||||||
|
--- a/elf/dl-support.c
|
||||||
|
+++ b/elf/dl-support.c
|
||||||
|
@@ -229,6 +229,13 @@ __rtld_lock_define_initialized_recursive (, _dl_load_lock)
|
||||||
|
list of loaded objects while an object is added to or removed from
|
||||||
|
that list. */
|
||||||
|
__rtld_lock_define_initialized_recursive (, _dl_load_write_lock)
|
||||||
|
+ /* This lock protects global and module specific TLS related data.
|
||||||
|
+ E.g. it is held in dlopen and dlclose when GL(dl_tls_generation),
|
||||||
|
+ GL(dl_tls_max_dtv_idx) or GL(dl_tls_dtv_slotinfo_list) are
|
||||||
|
+ accessed and when TLS related relocations are processed for a
|
||||||
|
+ module. It was introduced to keep pthread_create accessing TLS
|
||||||
|
+ state that is being set up. */
|
||||||
|
+__rtld_lock_define_initialized_recursive (, _dl_load_tls_lock)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_AUX_VECTOR
|
||||||
|
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
|
||||||
|
index 423e380f7ca654fe..40263cf586e74c64 100644
|
||||||
|
--- a/elf/dl-tls.c
|
||||||
|
+++ b/elf/dl-tls.c
|
||||||
|
@@ -532,7 +532,7 @@ _dl_allocate_tls_init (void *result)
|
||||||
|
size_t maxgen = 0;
|
||||||
|
|
||||||
|
/* Protects global dynamic TLS related state. */
|
||||||
|
- __rtld_lock_lock_recursive (GL(dl_load_lock));
|
||||||
|
+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
|
||||||
|
|
||||||
|
/* Check if the current dtv is big enough. */
|
||||||
|
if (dtv[-1].counter < GL(dl_tls_max_dtv_idx))
|
||||||
|
@@ -606,7 +606,7 @@ _dl_allocate_tls_init (void *result)
|
||||||
|
listp = listp->next;
|
||||||
|
assert (listp != NULL);
|
||||||
|
}
|
||||||
|
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||||
|
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||||
|
|
||||||
|
/* The DTV version is up-to-date now. */
|
||||||
|
dtv[0].counter = maxgen;
|
||||||
|
@@ -745,7 +745,7 @@ _dl_update_slotinfo (unsigned long int req_modid)
|
||||||
|
|
||||||
|
Here the dtv needs to be updated to new_gen generation count.
|
||||||
|
|
||||||
|
- This code may be called during TLS access when GL(dl_load_lock)
|
||||||
|
+ This code may be called during TLS access when GL(dl_load_tls_lock)
|
||||||
|
is not held. In that case the user code has to synchronize with
|
||||||
|
dlopen and dlclose calls of relevant modules. A module m is
|
||||||
|
relevant if the generation of m <= new_gen and dlclose of m is
|
||||||
|
@@ -867,11 +867,11 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
|
||||||
|
if (__glibc_unlikely (the_map->l_tls_offset
|
||||||
|
!= FORCED_DYNAMIC_TLS_OFFSET))
|
||||||
|
{
|
||||||
|
- __rtld_lock_lock_recursive (GL(dl_load_lock));
|
||||||
|
+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
|
||||||
|
if (__glibc_likely (the_map->l_tls_offset == NO_TLS_OFFSET))
|
||||||
|
{
|
||||||
|
the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
|
||||||
|
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||||
|
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||||
|
}
|
||||||
|
else if (__glibc_likely (the_map->l_tls_offset
|
||||||
|
!= FORCED_DYNAMIC_TLS_OFFSET))
|
||||||
|
@@ -883,7 +883,7 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
|
||||||
|
#else
|
||||||
|
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||||
|
#endif
|
||||||
|
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||||
|
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||||
|
|
||||||
|
dtv[GET_ADDR_MODULE].pointer.to_free = NULL;
|
||||||
|
dtv[GET_ADDR_MODULE].pointer.val = p;
|
||||||
|
@@ -891,7 +891,7 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
|
||||||
|
return (char *) p + GET_ADDR_OFFSET;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||||
|
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||||
|
}
|
||||||
|
struct dtv_pointer result = allocate_and_init (the_map);
|
||||||
|
dtv[GET_ADDR_MODULE].pointer = result;
|
||||||
|
@@ -962,7 +962,7 @@ _dl_tls_get_addr_soft (struct link_map *l)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
dtv_t *dtv = THREAD_DTV ();
|
||||||
|
- /* This may be called without holding the GL(dl_load_lock). Reading
|
||||||
|
+ /* This may be called without holding the GL(dl_load_tls_lock). Reading
|
||||||
|
arbitrary gen value is fine since this is best effort code. */
|
||||||
|
size_t gen = atomic_load_relaxed (&GL(dl_tls_generation));
|
||||||
|
if (__glibc_unlikely (dtv[0].counter != gen))
|
||||||
|
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||||
|
index d733359eaf808b8a..08cf50145a1c01ce 100644
|
||||||
|
--- a/elf/rtld.c
|
||||||
|
+++ b/elf/rtld.c
|
||||||
|
@@ -322,6 +322,7 @@ struct rtld_global _rtld_global =
|
||||||
|
#ifdef _LIBC_REENTRANT
|
||||||
|
._dl_load_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
|
||||||
|
._dl_load_write_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
|
||||||
|
+ ._dl_load_tls_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
|
||||||
|
#endif
|
||||||
|
._dl_nns = 1,
|
||||||
|
._dl_ns =
|
||||||
|
diff --git a/posix/fork.c b/posix/fork.c
|
||||||
|
index c471f7b15fe4290d..021691b9b7441f15 100644
|
||||||
|
--- a/posix/fork.c
|
||||||
|
+++ b/posix/fork.c
|
||||||
|
@@ -99,6 +99,9 @@ __libc_fork (void)
|
||||||
|
/* Reset the lock the dynamic loader uses to protect its data. */
|
||||||
|
__rtld_lock_initialize (GL(dl_load_lock));
|
||||||
|
|
||||||
|
+ /* Reset the lock protecting dynamic TLS related data. */
|
||||||
|
+ __rtld_lock_initialize (GL(dl_load_tls_lock));
|
||||||
|
+
|
||||||
|
reclaim_stacks ();
|
||||||
|
|
||||||
|
/* Run the handlers registered for the child. */
|
||||||
|
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||||
|
index 9c15259236adab43..1ceb9c3212c148ba 100644
|
||||||
|
--- a/sysdeps/generic/ldsodefs.h
|
||||||
|
+++ b/sysdeps/generic/ldsodefs.h
|
||||||
|
@@ -372,6 +372,13 @@ struct rtld_global
|
||||||
|
list of loaded objects while an object is added to or removed
|
||||||
|
from that list. */
|
||||||
|
__rtld_lock_define_recursive (EXTERN, _dl_load_write_lock)
|
||||||
|
+ /* This lock protects global and module specific TLS related data.
|
||||||
|
+ E.g. it is held in dlopen and dlclose when GL(dl_tls_generation),
|
||||||
|
+ GL(dl_tls_max_dtv_idx) or GL(dl_tls_dtv_slotinfo_list) are
|
||||||
|
+ accessed and when TLS related relocations are processed for a
|
||||||
|
+ module. It was introduced to keep pthread_create accessing TLS
|
||||||
|
+ state that is being set up. */
|
||||||
|
+ __rtld_lock_define_recursive (EXTERN, _dl_load_tls_lock)
|
||||||
|
|
||||||
|
/* Incremented whenever something may have been added to dl_loaded. */
|
||||||
|
EXTERN unsigned long long _dl_load_adds;
|
||||||
|
@@ -1261,7 +1268,7 @@ extern int _dl_scope_free (void *) attribute_hidden;
|
||||||
|
|
||||||
|
/* Add module to slot information data. If DO_ADD is false, only the
|
||||||
|
required memory is allocated. Must be called with GL
|
||||||
|
- (dl_load_lock) acquired. If the function has already been called
|
||||||
|
+ (dl_load_tls_lock) acquired. If the function has already been called
|
||||||
|
for the link map L with !do_add, then this function will not raise
|
||||||
|
an exception, otherwise it is possible that it encounters a memory
|
||||||
|
allocation failure. */
|
||||||
|
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
|
||||||
|
index 0af9c59b425aefb1..df8943f4860a39d8 100644
|
||||||
|
--- a/sysdeps/pthread/Makefile
|
||||||
|
+++ b/sysdeps/pthread/Makefile
|
||||||
|
@@ -152,15 +152,17 @@ tests += tst-cancelx2 tst-cancelx3 tst-cancelx6 tst-cancelx8 tst-cancelx9 \
|
||||||
|
tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3
|
||||||
|
|
||||||
|
ifeq ($(build-shared),yes)
|
||||||
|
-tests += tst-atfork2 tst-pt-tls4 tst-_res1 tst-fini1
|
||||||
|
+tests += tst-atfork2 tst-pt-tls4 tst-_res1 tst-fini1 tst-create1
|
||||||
|
tests-nolibpthread += tst-fini1
|
||||||
|
endif
|
||||||
|
|
||||||
|
modules-names += tst-atfork2mod tst-tls4moda tst-tls4modb \
|
||||||
|
- tst-_res1mod1 tst-_res1mod2 tst-fini1mod
|
||||||
|
+ tst-_res1mod1 tst-_res1mod2 tst-fini1mod \
|
||||||
|
+ tst-create1mod
|
||||||
|
test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names)))
|
||||||
|
|
||||||
|
tst-atfork2mod.so-no-z-defs = yes
|
||||||
|
+tst-create1mod.so-no-z-defs = yes
|
||||||
|
|
||||||
|
ifeq ($(build-shared),yes)
|
||||||
|
# Build all the modules even when not actually running test programs.
|
||||||
|
@@ -279,4 +281,8 @@ LDFLAGS-tst-join7mod.so = -Wl,-soname,tst-join7mod.so
|
||||||
|
|
||||||
|
CFLAGS-tst-unwind-thread.c += -funwind-tables
|
||||||
|
|
||||||
|
+LDFLAGS-tst-create1 = -Wl,-export-dynamic
|
||||||
|
+$(objpfx)tst-create1: $(shared-thread-library)
|
||||||
|
+$(objpfx)tst-create1.out: $(objpfx)tst-create1mod.so
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
diff --git a/sysdeps/pthread/tst-create1.c b/sysdeps/pthread/tst-create1.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..932586c30990d1d4
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/pthread/tst-create1.c
|
||||||
|
@@ -0,0 +1,119 @@
|
||||||
|
+/* Verify that pthread_create does not deadlock when ctors take locks.
|
||||||
|
+ 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/>. */
|
||||||
|
+
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <support/xdlfcn.h>
|
||||||
|
+#include <support/xthread.h>
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+Check if ctor and pthread_create deadlocks in
|
||||||
|
+
|
||||||
|
+thread 1: dlopen -> ctor -> lock(user_lock)
|
||||||
|
+thread 2: lock(user_lock) -> pthread_create
|
||||||
|
+
|
||||||
|
+or in
|
||||||
|
+
|
||||||
|
+thread 1: dlclose -> dtor -> lock(user_lock)
|
||||||
|
+thread 2: lock(user_lock) -> pthread_create
|
||||||
|
+*/
|
||||||
|
+
|
||||||
|
+static pthread_barrier_t bar_ctor;
|
||||||
|
+static pthread_barrier_t bar_dtor;
|
||||||
|
+static pthread_mutex_t user_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+ctor (void)
|
||||||
|
+{
|
||||||
|
+ xpthread_barrier_wait (&bar_ctor);
|
||||||
|
+ dprintf (1, "thread 1: in ctor: started.\n");
|
||||||
|
+ xpthread_mutex_lock (&user_lock);
|
||||||
|
+ dprintf (1, "thread 1: in ctor: locked user_lock.\n");
|
||||||
|
+ xpthread_mutex_unlock (&user_lock);
|
||||||
|
+ dprintf (1, "thread 1: in ctor: unlocked user_lock.\n");
|
||||||
|
+ dprintf (1, "thread 1: in ctor: done.\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+dtor (void)
|
||||||
|
+{
|
||||||
|
+ xpthread_barrier_wait (&bar_dtor);
|
||||||
|
+ dprintf (1, "thread 1: in dtor: started.\n");
|
||||||
|
+ xpthread_mutex_lock (&user_lock);
|
||||||
|
+ dprintf (1, "thread 1: in dtor: locked user_lock.\n");
|
||||||
|
+ xpthread_mutex_unlock (&user_lock);
|
||||||
|
+ dprintf (1, "thread 1: in dtor: unlocked user_lock.\n");
|
||||||
|
+ dprintf (1, "thread 1: in dtor: done.\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void *
|
||||||
|
+thread3 (void *a)
|
||||||
|
+{
|
||||||
|
+ dprintf (1, "thread 3: started.\n");
|
||||||
|
+ dprintf (1, "thread 3: done.\n");
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void *
|
||||||
|
+thread2 (void *a)
|
||||||
|
+{
|
||||||
|
+ pthread_t t3;
|
||||||
|
+ dprintf (1, "thread 2: started.\n");
|
||||||
|
+
|
||||||
|
+ xpthread_mutex_lock (&user_lock);
|
||||||
|
+ dprintf (1, "thread 2: locked user_lock.\n");
|
||||||
|
+ xpthread_barrier_wait (&bar_ctor);
|
||||||
|
+ t3 = xpthread_create (0, thread3, 0);
|
||||||
|
+ xpthread_mutex_unlock (&user_lock);
|
||||||
|
+ dprintf (1, "thread 2: unlocked user_lock.\n");
|
||||||
|
+ xpthread_join (t3);
|
||||||
|
+
|
||||||
|
+ xpthread_mutex_lock (&user_lock);
|
||||||
|
+ dprintf (1, "thread 2: locked user_lock.\n");
|
||||||
|
+ xpthread_barrier_wait (&bar_dtor);
|
||||||
|
+ t3 = xpthread_create (0, thread3, 0);
|
||||||
|
+ xpthread_mutex_unlock (&user_lock);
|
||||||
|
+ dprintf (1, "thread 2: unlocked user_lock.\n");
|
||||||
|
+ xpthread_join (t3);
|
||||||
|
+
|
||||||
|
+ dprintf (1, "thread 2: done.\n");
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+thread1 (void)
|
||||||
|
+{
|
||||||
|
+ dprintf (1, "thread 1: started.\n");
|
||||||
|
+ xpthread_barrier_init (&bar_ctor, NULL, 2);
|
||||||
|
+ xpthread_barrier_init (&bar_dtor, NULL, 2);
|
||||||
|
+ pthread_t t2 = xpthread_create (0, thread2, 0);
|
||||||
|
+ void *p = xdlopen ("tst-create1mod.so", RTLD_NOW | RTLD_GLOBAL);
|
||||||
|
+ dprintf (1, "thread 1: dlopen done.\n");
|
||||||
|
+ xdlclose (p);
|
||||||
|
+ dprintf (1, "thread 1: dlclose done.\n");
|
||||||
|
+ xpthread_join (t2);
|
||||||
|
+ dprintf (1, "thread 1: done.\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ thread1 ();
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
||||||
|
diff --git a/sysdeps/pthread/tst-create1mod.c b/sysdeps/pthread/tst-create1mod.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..62c9006961683177
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/pthread/tst-create1mod.c
|
||||||
|
@@ -0,0 +1,41 @@
|
||||||
|
+/* Verify that pthread_create does not deadlock when ctors take locks.
|
||||||
|
+ 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/>. */
|
||||||
|
+
|
||||||
|
+#include <stdio.h>
|
||||||
|
+
|
||||||
|
+/* Require TLS setup for the module. */
|
||||||
|
+__thread int tlsvar;
|
||||||
|
+
|
||||||
|
+void ctor (void);
|
||||||
|
+void dtor (void);
|
||||||
|
+
|
||||||
|
+static void __attribute__ ((constructor))
|
||||||
|
+do_init (void)
|
||||||
|
+{
|
||||||
|
+ dprintf (1, "constructor started: %d.\n", tlsvar++);
|
||||||
|
+ ctor ();
|
||||||
|
+ dprintf (1, "constructor done: %d.\n", tlsvar++);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void __attribute__ ((destructor))
|
||||||
|
+do_end (void)
|
||||||
|
+{
|
||||||
|
+ dprintf (1, "destructor started: %d.\n", tlsvar++);
|
||||||
|
+ dtor ();
|
||||||
|
+ dprintf (1, "destructor done: %d.\n", tlsvar++);
|
||||||
|
+}
|
151
glibc-upstream-2.34-40.patch
Normal file
151
glibc-upstream-2.34-40.patch
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
commit 01bffc013cdad1e0c45db7aa57efb2bee61f3338
|
||||||
|
Author: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Date: Fri Oct 29 14:53:55 2021 +0530
|
||||||
|
|
||||||
|
Handle NULL input to malloc_usable_size [BZ #28506]
|
||||||
|
|
||||||
|
Hoist the NULL check for malloc_usable_size into its entry points in
|
||||||
|
malloc-debug and malloc and assume non-NULL in all callees. This fixes
|
||||||
|
BZ #28506
|
||||||
|
|
||||||
|
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
|
||||||
|
(cherry picked from commit 88e316b06414ee7c944cd6f8b30b07a972b78499)
|
||||||
|
|
||||||
|
diff --git a/malloc/malloc-debug.c b/malloc/malloc-debug.c
|
||||||
|
index 9922ef5f25d2e018..3d7e6d44fdc9e17b 100644
|
||||||
|
--- a/malloc/malloc-debug.c
|
||||||
|
+++ b/malloc/malloc-debug.c
|
||||||
|
@@ -1,5 +1,6 @@
|
||||||
|
/* Malloc debug DSO.
|
||||||
|
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||||
|
+ Copyright The GNU Toolchain Authors.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@@ -399,17 +400,17 @@ strong_alias (__debug_calloc, calloc)
|
||||||
|
size_t
|
||||||
|
malloc_usable_size (void *mem)
|
||||||
|
{
|
||||||
|
+ if (mem == NULL)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK))
|
||||||
|
return mcheck_usable_size (mem);
|
||||||
|
if (__is_malloc_debug_enabled (MALLOC_CHECK_HOOK))
|
||||||
|
return malloc_check_get_size (mem);
|
||||||
|
|
||||||
|
- if (mem != NULL)
|
||||||
|
- {
|
||||||
|
- mchunkptr p = mem2chunk (mem);
|
||||||
|
- if (DUMPED_MAIN_ARENA_CHUNK (p))
|
||||||
|
- return chunksize (p) - SIZE_SZ;
|
||||||
|
- }
|
||||||
|
+ mchunkptr p = mem2chunk (mem);
|
||||||
|
+ if (DUMPED_MAIN_ARENA_CHUNK (p))
|
||||||
|
+ return chunksize (p) - SIZE_SZ;
|
||||||
|
|
||||||
|
return musable (mem);
|
||||||
|
}
|
||||||
|
diff --git a/malloc/malloc.c b/malloc/malloc.c
|
||||||
|
index e065785af77af72c..7882c70f0a0312d1 100644
|
||||||
|
--- a/malloc/malloc.c
|
||||||
|
+++ b/malloc/malloc.c
|
||||||
|
@@ -1,5 +1,6 @@
|
||||||
|
/* Malloc implementation for multiple threads without lock contention.
|
||||||
|
Copyright (C) 1996-2021 Free Software Foundation, Inc.
|
||||||
|
+ Copyright The GNU Toolchain Authors.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Wolfram Gloger <wg@malloc.de>
|
||||||
|
and Doug Lea <dl@cs.oswego.edu>, 2001.
|
||||||
|
@@ -5009,20 +5010,13 @@ __malloc_trim (size_t s)
|
||||||
|
static size_t
|
||||||
|
musable (void *mem)
|
||||||
|
{
|
||||||
|
- mchunkptr p;
|
||||||
|
- if (mem != 0)
|
||||||
|
- {
|
||||||
|
- size_t result = 0;
|
||||||
|
-
|
||||||
|
- p = mem2chunk (mem);
|
||||||
|
+ mchunkptr p = mem2chunk (mem);
|
||||||
|
|
||||||
|
- if (chunk_is_mmapped (p))
|
||||||
|
- result = chunksize (p) - CHUNK_HDR_SZ;
|
||||||
|
- else if (inuse (p))
|
||||||
|
- result = memsize (p);
|
||||||
|
+ if (chunk_is_mmapped (p))
|
||||||
|
+ return chunksize (p) - CHUNK_HDR_SZ;
|
||||||
|
+ else if (inuse (p))
|
||||||
|
+ return memsize (p);
|
||||||
|
|
||||||
|
- return result;
|
||||||
|
- }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -5030,10 +5024,9 @@ musable (void *mem)
|
||||||
|
size_t
|
||||||
|
__malloc_usable_size (void *m)
|
||||||
|
{
|
||||||
|
- size_t result;
|
||||||
|
-
|
||||||
|
- result = musable (m);
|
||||||
|
- return result;
|
||||||
|
+ if (m == NULL)
|
||||||
|
+ return 0;
|
||||||
|
+ return musable (m);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
diff --git a/malloc/tst-malloc-usable.c b/malloc/tst-malloc-usable.c
|
||||||
|
index a1074b782a0de96c..b0d702be10ba1610 100644
|
||||||
|
--- a/malloc/tst-malloc-usable.c
|
||||||
|
+++ b/malloc/tst-malloc-usable.c
|
||||||
|
@@ -2,6 +2,7 @@
|
||||||
|
MALLOC_CHECK_ exported to a positive value.
|
||||||
|
|
||||||
|
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
||||||
|
+ Copyright The GNU Toolchain Authors.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@@ -21,29 +22,24 @@
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
+#include <support/support.h>
|
||||||
|
+#include <support/check.h>
|
||||||
|
|
||||||
|
static int
|
||||||
|
do_test (void)
|
||||||
|
{
|
||||||
|
size_t usable_size;
|
||||||
|
void *p = malloc (7);
|
||||||
|
- if (!p)
|
||||||
|
- {
|
||||||
|
- printf ("memory allocation failed\n");
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
|
||||||
|
+ TEST_VERIFY_EXIT (p != NULL);
|
||||||
|
usable_size = malloc_usable_size (p);
|
||||||
|
- if (usable_size != 7)
|
||||||
|
- {
|
||||||
|
- printf ("malloc_usable_size: expected 7 but got %zu\n", usable_size);
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
+ TEST_COMPARE (usable_size, 7);
|
||||||
|
memset (p, 0, usable_size);
|
||||||
|
free (p);
|
||||||
|
+
|
||||||
|
+ TEST_COMPARE (malloc_usable_size (NULL), 0);
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#define TEST_FUNCTION do_test ()
|
||||||
|
-#include "../test-skeleton.c"
|
||||||
|
+#include "support/test-driver.c"
|
489
glibc-upstream-2.34-41.patch
Normal file
489
glibc-upstream-2.34-41.patch
Normal file
@ -0,0 +1,489 @@
|
|||||||
|
commit f42373f911a28d34325a5bfc1ed5a962c89da7eb
|
||||||
|
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||||
|
Date: Thu Sep 16 08:15:29 2021 -0700
|
||||||
|
|
||||||
|
ld.so: Replace DL_RO_DYN_SECTION with dl_relocate_ld [BZ #28340]
|
||||||
|
|
||||||
|
We can't relocate entries in dynamic section if it is readonly:
|
||||||
|
|
||||||
|
1. Add a l_ld_readonly field to struct link_map to indicate if dynamic
|
||||||
|
section is readonly and set it based on p_flags of PT_DYNAMIC segment.
|
||||||
|
2. Replace DL_RO_DYN_SECTION with dl_relocate_ld to decide if dynamic
|
||||||
|
section should be relocated.
|
||||||
|
3. Remove DL_RO_DYN_TEMP_CNT.
|
||||||
|
4. Don't use a static dynamic section to make readonly dynamic section
|
||||||
|
in vDSO writable.
|
||||||
|
5. Remove the temp argument from elf_get_dynamic_info.
|
||||||
|
|
||||||
|
This fixes BZ #28340.
|
||||||
|
|
||||||
|
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
(cherry picked from commit b413280cfb16834450f66f554bc0d618bb513851)
|
||||||
|
|
||||||
|
diff --git a/elf/Makefile b/elf/Makefile
|
||||||
|
index d05f410592723f09..de854b4d1a815bd3 100644
|
||||||
|
--- a/elf/Makefile
|
||||||
|
+++ b/elf/Makefile
|
||||||
|
@@ -224,7 +224,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||||
|
tst-tls-ie tst-tls-ie-dlmopen argv0test \
|
||||||
|
tst-glibc-hwcaps tst-glibc-hwcaps-prepend tst-glibc-hwcaps-mask \
|
||||||
|
tst-tls20 tst-tls21 tst-dlmopen-dlerror tst-dlmopen-gethostbyname \
|
||||||
|
- tst-dl-is_dso
|
||||||
|
+ tst-dl-is_dso tst-ro-dynamic
|
||||||
|
# reldep9
|
||||||
|
tests-internal += loadtest unload unload2 circleload1 \
|
||||||
|
neededtest neededtest2 neededtest3 neededtest4 \
|
||||||
|
@@ -357,7 +357,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||||
|
libmarkermod4-1 libmarkermod4-2 libmarkermod4-3 libmarkermod4-4 \
|
||||||
|
tst-tls20mod-bad tst-tls21mod tst-dlmopen-dlerror-mod \
|
||||||
|
tst-auxvalmod \
|
||||||
|
- tst-dlmopen-gethostbyname-mod \
|
||||||
|
+ tst-dlmopen-gethostbyname-mod tst-ro-dynamic-mod \
|
||||||
|
|
||||||
|
# Most modules build with _ISOMAC defined, but those filtered out
|
||||||
|
# depend on internal headers.
|
||||||
|
@@ -1906,3 +1906,10 @@ $(objpfx)tst-getauxval-static.out: $(objpfx)tst-auxvalmod.so
|
||||||
|
tst-getauxval-static-ENV = LD_LIBRARY_PATH=$(objpfx):$(common-objpfx)
|
||||||
|
|
||||||
|
$(objpfx)tst-dlmopen-gethostbyname.out: $(objpfx)tst-dlmopen-gethostbyname-mod.so
|
||||||
|
+
|
||||||
|
+$(objpfx)tst-ro-dynamic: $(objpfx)tst-ro-dynamic-mod.so
|
||||||
|
+$(objpfx)tst-ro-dynamic-mod.so: $(objpfx)tst-ro-dynamic-mod.os \
|
||||||
|
+ tst-ro-dynamic-mod.map
|
||||||
|
+ $(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
|
||||||
|
+ -Wl,--script=tst-ro-dynamic-mod.map \
|
||||||
|
+ $(objpfx)tst-ro-dynamic-mod.os
|
||||||
|
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||||
|
index 650e4edc35e5e582..4445c28ef3fb4a7e 100644
|
||||||
|
--- a/elf/dl-load.c
|
||||||
|
+++ b/elf/dl-load.c
|
||||||
|
@@ -1149,6 +1149,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
|
||||||
|
such a segment to avoid a crash later. */
|
||||||
|
l->l_ld = (void *) ph->p_vaddr;
|
||||||
|
l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn));
|
||||||
|
+ l->l_ld_readonly = (ph->p_flags & PF_W) == 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -1292,7 +1293,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
|
||||||
|
else
|
||||||
|
l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr);
|
||||||
|
|
||||||
|
- elf_get_dynamic_info (l, NULL);
|
||||||
|
+ elf_get_dynamic_info (l);
|
||||||
|
|
||||||
|
/* Make sure we are not dlopen'ing an object that has the
|
||||||
|
DF_1_NOOPEN flag set, or a PIE object. */
|
||||||
|
diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c
|
||||||
|
index d5bd2f31e9ca50ce..2fb02d727654c87d 100644
|
||||||
|
--- a/elf/dl-reloc-static-pie.c
|
||||||
|
+++ b/elf/dl-reloc-static-pie.c
|
||||||
|
@@ -40,7 +40,17 @@ _dl_relocate_static_pie (void)
|
||||||
|
|
||||||
|
/* Read our own dynamic section and fill in the info array. */
|
||||||
|
main_map->l_ld = ((void *) main_map->l_addr + elf_machine_dynamic ());
|
||||||
|
- elf_get_dynamic_info (main_map, NULL);
|
||||||
|
+
|
||||||
|
+ const ElfW(Phdr) *ph, *phdr = GL(dl_phdr);
|
||||||
|
+ size_t phnum = GL(dl_phnum);
|
||||||
|
+ for (ph = phdr; ph < &phdr[phnum]; ++ph)
|
||||||
|
+ if (ph->p_type == PT_DYNAMIC)
|
||||||
|
+ {
|
||||||
|
+ main_map->l_ld_readonly = (ph->p_flags & PF_W) == 0;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ elf_get_dynamic_info (main_map);
|
||||||
|
|
||||||
|
# ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
|
||||||
|
ELF_MACHINE_BEFORE_RTLD_RELOC (main_map->l_info);
|
||||||
|
diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h
|
||||||
|
index d8ec32377d37635c..4aa2058abf6443c9 100644
|
||||||
|
--- a/elf/get-dynamic-info.h
|
||||||
|
+++ b/elf/get-dynamic-info.h
|
||||||
|
@@ -28,7 +28,7 @@ static
|
||||||
|
auto
|
||||||
|
#endif
|
||||||
|
inline void __attribute__ ((unused, always_inline))
|
||||||
|
-elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
|
||||||
|
+elf_get_dynamic_info (struct link_map *l)
|
||||||
|
{
|
||||||
|
#if __ELF_NATIVE_CLASS == 32
|
||||||
|
typedef Elf32_Word d_tag_utype;
|
||||||
|
@@ -69,28 +69,15 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
|
||||||
|
info[i] = dyn;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#define DL_RO_DYN_TEMP_CNT 8
|
||||||
|
-
|
||||||
|
-#ifndef DL_RO_DYN_SECTION
|
||||||
|
/* Don't adjust .dynamic unnecessarily. */
|
||||||
|
- if (l->l_addr != 0)
|
||||||
|
+ if (l->l_addr != 0 && dl_relocate_ld (l))
|
||||||
|
{
|
||||||
|
ElfW(Addr) l_addr = l->l_addr;
|
||||||
|
- int cnt = 0;
|
||||||
|
|
||||||
|
# define ADJUST_DYN_INFO(tag) \
|
||||||
|
do \
|
||||||
|
if (info[tag] != NULL) \
|
||||||
|
- { \
|
||||||
|
- if (temp) \
|
||||||
|
- { \
|
||||||
|
- temp[cnt].d_tag = info[tag]->d_tag; \
|
||||||
|
- temp[cnt].d_un.d_ptr = info[tag]->d_un.d_ptr + l_addr; \
|
||||||
|
- info[tag] = temp + cnt++; \
|
||||||
|
- } \
|
||||||
|
- else \
|
||||||
|
- info[tag]->d_un.d_ptr += l_addr; \
|
||||||
|
- } \
|
||||||
|
+ info[tag]->d_un.d_ptr += l_addr; \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
ADJUST_DYN_INFO (DT_HASH);
|
||||||
|
@@ -107,9 +94,7 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
|
||||||
|
ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM));
|
||||||
|
ADJUST_DYN_INFO (ADDRIDX (DT_GNU_HASH));
|
||||||
|
# undef ADJUST_DYN_INFO
|
||||||
|
- assert (cnt <= DL_RO_DYN_TEMP_CNT);
|
||||||
|
}
|
||||||
|
-#endif
|
||||||
|
if (info[DT_PLTREL] != NULL)
|
||||||
|
{
|
||||||
|
#if ELF_MACHINE_NO_RELA
|
||||||
|
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||||
|
index 08cf50145a1c01ce..405166d62b34847c 100644
|
||||||
|
--- a/elf/rtld.c
|
||||||
|
+++ b/elf/rtld.c
|
||||||
|
@@ -464,6 +464,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
|
||||||
|
#ifndef DONT_USE_BOOTSTRAP_MAP
|
||||||
|
GL(dl_rtld_map).l_addr = info->l.l_addr;
|
||||||
|
GL(dl_rtld_map).l_ld = info->l.l_ld;
|
||||||
|
+ GL(dl_rtld_map).l_ld_readonly = info->l.l_ld_readonly;
|
||||||
|
memcpy (GL(dl_rtld_map).l_info, info->l.l_info,
|
||||||
|
sizeof GL(dl_rtld_map).l_info);
|
||||||
|
GL(dl_rtld_map).l_mach = info->l.l_mach;
|
||||||
|
@@ -547,7 +548,7 @@ _dl_start (void *arg)
|
||||||
|
|
||||||
|
/* Read our own dynamic section and fill in the info array. */
|
||||||
|
bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
|
||||||
|
- elf_get_dynamic_info (&bootstrap_map, NULL);
|
||||||
|
+ elf_get_dynamic_info (&bootstrap_map);
|
||||||
|
|
||||||
|
#if NO_TLS_OFFSET != 0
|
||||||
|
bootstrap_map.l_tls_offset = NO_TLS_OFFSET;
|
||||||
|
@@ -1469,6 +1470,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||||
|
/* This tells us where to find the dynamic section,
|
||||||
|
which tells us everything we need to do. */
|
||||||
|
main_map->l_ld = (void *) main_map->l_addr + ph->p_vaddr;
|
||||||
|
+ main_map->l_ld_readonly = (ph->p_flags & PF_W) == 0;
|
||||||
|
break;
|
||||||
|
case PT_INTERP:
|
||||||
|
/* This "interpreter segment" was used by the program loader to
|
||||||
|
@@ -1614,7 +1616,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||||
|
if (! rtld_is_main)
|
||||||
|
{
|
||||||
|
/* Extract the contents of the dynamic section for easy access. */
|
||||||
|
- elf_get_dynamic_info (main_map, NULL);
|
||||||
|
+ elf_get_dynamic_info (main_map);
|
||||||
|
|
||||||
|
/* If the main map is libc.so, update the base namespace to
|
||||||
|
refer to this map. If libc.so is loaded later, this happens
|
||||||
|
diff --git a/elf/setup-vdso.h b/elf/setup-vdso.h
|
||||||
|
index 86c491e49c98345d..f44748bc9858e5fd 100644
|
||||||
|
--- a/elf/setup-vdso.h
|
||||||
|
+++ b/elf/setup-vdso.h
|
||||||
|
@@ -33,8 +33,6 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
|
||||||
|
0, LM_ID_BASE);
|
||||||
|
if (__glibc_likely (l != NULL))
|
||||||
|
{
|
||||||
|
- static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT] attribute_relro;
|
||||||
|
-
|
||||||
|
l->l_phdr = ((const void *) GLRO(dl_sysinfo_dso)
|
||||||
|
+ GLRO(dl_sysinfo_dso)->e_phoff);
|
||||||
|
l->l_phnum = GLRO(dl_sysinfo_dso)->e_phnum;
|
||||||
|
@@ -45,6 +43,7 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
|
||||||
|
{
|
||||||
|
l->l_ld = (void *) ph->p_vaddr;
|
||||||
|
l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn));
|
||||||
|
+ l->l_ld_readonly = (ph->p_flags & PF_W) == 0;
|
||||||
|
}
|
||||||
|
else if (ph->p_type == PT_LOAD)
|
||||||
|
{
|
||||||
|
@@ -65,7 +64,7 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
|
||||||
|
l->l_map_end += l->l_addr;
|
||||||
|
l->l_text_end += l->l_addr;
|
||||||
|
l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr);
|
||||||
|
- elf_get_dynamic_info (l, dyn_temp);
|
||||||
|
+ elf_get_dynamic_info (l);
|
||||||
|
_dl_setup_hash (l);
|
||||||
|
l->l_relocated = 1;
|
||||||
|
|
||||||
|
diff --git a/elf/tst-ro-dynamic-mod.c b/elf/tst-ro-dynamic-mod.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..6d99925964c50caf
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/elf/tst-ro-dynamic-mod.c
|
||||||
|
@@ -0,0 +1,19 @@
|
||||||
|
+/* Test case for DSO with readonly dynamic section.
|
||||||
|
+ 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/>. */
|
||||||
|
+
|
||||||
|
+int foo = -1;
|
||||||
|
diff --git a/elf/tst-ro-dynamic-mod.map b/elf/tst-ro-dynamic-mod.map
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..2fe4a2998cddd587
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/elf/tst-ro-dynamic-mod.map
|
||||||
|
@@ -0,0 +1,16 @@
|
||||||
|
+SECTIONS
|
||||||
|
+{
|
||||||
|
+ . = SIZEOF_HEADERS;
|
||||||
|
+ .dynamic : { *(.dynamic) } :text :dynamic
|
||||||
|
+ .rodata : { *(.data*) *(.bss*) } :text
|
||||||
|
+ /DISCARD/ : {
|
||||||
|
+ *(.note.gnu.property)
|
||||||
|
+ }
|
||||||
|
+ .note : { *(.note.*) } :text :note
|
||||||
|
+}
|
||||||
|
+PHDRS
|
||||||
|
+{
|
||||||
|
+ text PT_LOAD FLAGS(5) FILEHDR PHDRS;
|
||||||
|
+ dynamic PT_DYNAMIC FLAGS(4);
|
||||||
|
+ note PT_NOTE FLAGS(4);
|
||||||
|
+}
|
||||||
|
diff --git a/elf/tst-ro-dynamic.c b/elf/tst-ro-dynamic.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..3a18f8789ad386bb
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/elf/tst-ro-dynamic.c
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+/* Test case for DSO with readonly dynamic section.
|
||||||
|
+ 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/>. */
|
||||||
|
+
|
||||||
|
+#include <support/check.h>
|
||||||
|
+#include <support/test-driver.h>
|
||||||
|
+
|
||||||
|
+extern int foo;
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ TEST_COMPARE (foo, -1);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
||||||
|
diff --git a/include/link.h b/include/link.h
|
||||||
|
index 4af16cb59639a077..c46aced9f7b43ba0 100644
|
||||||
|
--- a/include/link.h
|
||||||
|
+++ b/include/link.h
|
||||||
|
@@ -205,6 +205,7 @@ struct link_map
|
||||||
|
unsigned int l_free_initfini:1; /* Nonzero if l_initfini can be
|
||||||
|
freed, ie. not allocated with
|
||||||
|
the dummy malloc in ld.so. */
|
||||||
|
+ unsigned int l_ld_readonly:1; /* Nonzero if dynamic section is readonly. */
|
||||||
|
|
||||||
|
/* NODELETE status of the map. Only valid for maps of type
|
||||||
|
lt_loaded. Lazy binding sets l_nodelete_active directly,
|
||||||
|
@@ -342,6 +343,8 @@ struct link_map
|
||||||
|
unsigned long long int l_serial;
|
||||||
|
};
|
||||||
|
|
||||||
|
+#include <dl-relocate-ld.h>
|
||||||
|
+
|
||||||
|
/* Information used by audit modules. For most link maps, this data
|
||||||
|
immediate follows the link map in memory. For the dynamic linker,
|
||||||
|
it is allocated separately. See link_map_audit_state in
|
||||||
|
diff --git a/sysdeps/generic/dl-relocate-ld.h b/sysdeps/generic/dl-relocate-ld.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..5fae206db9941e97
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/generic/dl-relocate-ld.h
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+/* Check if dynamic section should be relocated. Generic version.
|
||||||
|
+ 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/>. */
|
||||||
|
+
|
||||||
|
+#ifndef _DL_RELOCATE_LD_H
|
||||||
|
+#define _DL_RELOCATE_LD_H
|
||||||
|
+
|
||||||
|
+/* Return true if dynamic section in the shared library L should be
|
||||||
|
+ relocated. */
|
||||||
|
+
|
||||||
|
+static inline bool
|
||||||
|
+dl_relocate_ld (const struct link_map *l)
|
||||||
|
+{
|
||||||
|
+ /* Don't relocate dynamic section if it is readonly */
|
||||||
|
+ return !l->l_ld_readonly;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* _DL_RELOCATE_LD_H */
|
||||||
|
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||||
|
index 1ceb9c3212c148ba..ed10953f34b96c49 100644
|
||||||
|
--- a/sysdeps/generic/ldsodefs.h
|
||||||
|
+++ b/sysdeps/generic/ldsodefs.h
|
||||||
|
@@ -75,11 +75,8 @@ __BEGIN_DECLS
|
||||||
|
have to be accessed via the D_PTR macro. The macro is needed since for
|
||||||
|
most architectures the entry is already relocated - but for some not
|
||||||
|
and we need to relocate at access time. */
|
||||||
|
-#ifdef DL_RO_DYN_SECTION
|
||||||
|
-# define D_PTR(map, i) ((map)->i->d_un.d_ptr + (map)->l_addr)
|
||||||
|
-#else
|
||||||
|
-# define D_PTR(map, i) (map)->i->d_un.d_ptr
|
||||||
|
-#endif
|
||||||
|
+#define D_PTR(map, i) \
|
||||||
|
+ ((map)->i->d_un.d_ptr + (dl_relocate_ld (map) ? 0 : (map)->l_addr))
|
||||||
|
|
||||||
|
/* Result of the lookup functions and how to retrieve the base address. */
|
||||||
|
typedef struct link_map *lookup_t;
|
||||||
|
diff --git a/sysdeps/mips/dl-relocate-ld.h b/sysdeps/mips/dl-relocate-ld.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..0c18d9a567cad54f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/mips/dl-relocate-ld.h
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+/* Check if dynamic section should be relocated. MIPS version.
|
||||||
|
+ 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/>. */
|
||||||
|
+
|
||||||
|
+#ifndef _DL_RELOCATE_LD_H
|
||||||
|
+#define _DL_RELOCATE_LD_H
|
||||||
|
+
|
||||||
|
+/* Return true if dynamic section in the shared library L should be
|
||||||
|
+ relocated. */
|
||||||
|
+
|
||||||
|
+static inline bool
|
||||||
|
+dl_relocate_ld (const struct link_map *l)
|
||||||
|
+{
|
||||||
|
+ /* Never relocate dynamic section. */
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* _DL_RELOCATE_LD_H */
|
||||||
|
diff --git a/sysdeps/mips/ldsodefs.h b/sysdeps/mips/ldsodefs.h
|
||||||
|
index 4db7c60e38e42ef2..36fd09a8bdb4cacf 100644
|
||||||
|
--- a/sysdeps/mips/ldsodefs.h
|
||||||
|
+++ b/sysdeps/mips/ldsodefs.h
|
||||||
|
@@ -75,10 +75,6 @@ struct La_mips_64_retval;
|
||||||
|
struct La_mips_64_retval *, \
|
||||||
|
const char *);
|
||||||
|
|
||||||
|
-/* The MIPS ABI specifies that the dynamic section has to be read-only. */
|
||||||
|
-
|
||||||
|
-#define DL_RO_DYN_SECTION 1
|
||||||
|
-
|
||||||
|
#include_next <ldsodefs.h>
|
||||||
|
|
||||||
|
/* The 64-bit MIPS ELF ABI uses an unusual reloc format. Each
|
||||||
|
diff --git a/sysdeps/riscv/dl-relocate-ld.h b/sysdeps/riscv/dl-relocate-ld.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..10327454b17a7097
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/riscv/dl-relocate-ld.h
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+/* Check if dynamic section should be relocated. RISC-V version.
|
||||||
|
+ 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/>. */
|
||||||
|
+
|
||||||
|
+#ifndef _DL_RELOCATE_LD_H
|
||||||
|
+#define _DL_RELOCATE_LD_H
|
||||||
|
+
|
||||||
|
+/* Return true if dynamic section in the shared library L should be
|
||||||
|
+ relocated. */
|
||||||
|
+
|
||||||
|
+static inline bool
|
||||||
|
+dl_relocate_ld (const struct link_map *l)
|
||||||
|
+{
|
||||||
|
+ /* Never relocate dynamic section for ABI compatibility. */
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* _DL_RELOCATE_LD_H */
|
||||||
|
diff --git a/sysdeps/riscv/ldsodefs.h b/sysdeps/riscv/ldsodefs.h
|
||||||
|
index 0c696714a7a93cff..8947ffe4b5026a2e 100644
|
||||||
|
--- a/sysdeps/riscv/ldsodefs.h
|
||||||
|
+++ b/sysdeps/riscv/ldsodefs.h
|
||||||
|
@@ -38,11 +38,6 @@ struct La_riscv_retval;
|
||||||
|
struct La_riscv_retval *, \
|
||||||
|
const char *);
|
||||||
|
|
||||||
|
-/* Although the RISC-V ABI does not specify that the dynamic section has
|
||||||
|
- to be read-only, it needs to be kept for ABI compatibility. */
|
||||||
|
-
|
||||||
|
-#define DL_RO_DYN_SECTION 1
|
||||||
|
-
|
||||||
|
#include_next <ldsodefs.h>
|
||||||
|
|
||||||
|
#endif
|
117
glibc-upstream-2.34-42.patch
Normal file
117
glibc-upstream-2.34-42.patch
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
commit 5f36e5c70107ecb59281ef57f9f1c0e37ec3076d
|
||||||
|
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||||
|
Date: Thu Sep 23 09:06:49 2021 -0700
|
||||||
|
|
||||||
|
ld.so: Initialize bootstrap_map.l_ld_readonly [BZ #28340]
|
||||||
|
|
||||||
|
1. Define DL_RO_DYN_SECTION to initalize bootstrap_map.l_ld_readonly
|
||||||
|
before calling elf_get_dynamic_info to get dynamic info in bootstrap_map,
|
||||||
|
2. Define a single
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
dl_relocate_ld (const struct link_map *l)
|
||||||
|
{
|
||||||
|
/* Don't relocate dynamic section if it is readonly */
|
||||||
|
return !(l->l_ld_readonly || DL_RO_DYN_SECTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
This updates BZ #28340 fix.
|
||||||
|
|
||||||
|
(cherry picked from commit 2ec99d8c42b2ff1a1231e4df462a0910a9b7fdef)
|
||||||
|
|
||||||
|
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||||
|
index 405166d62b34847c..d83ac1bdc40a6081 100644
|
||||||
|
--- a/elf/rtld.c
|
||||||
|
+++ b/elf/rtld.c
|
||||||
|
@@ -548,6 +548,7 @@ _dl_start (void *arg)
|
||||||
|
|
||||||
|
/* Read our own dynamic section and fill in the info array. */
|
||||||
|
bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
|
||||||
|
+ bootstrap_map.l_ld_readonly = DL_RO_DYN_SECTION;
|
||||||
|
elf_get_dynamic_info (&bootstrap_map);
|
||||||
|
|
||||||
|
#if NO_TLS_OFFSET != 0
|
||||||
|
diff --git a/sysdeps/generic/dl-relocate-ld.h b/sysdeps/generic/dl-relocate-ld.h
|
||||||
|
index 5fae206db9941e97..cfb86c2d6a2394c1 100644
|
||||||
|
--- a/sysdeps/generic/dl-relocate-ld.h
|
||||||
|
+++ b/sysdeps/generic/dl-relocate-ld.h
|
||||||
|
@@ -19,14 +19,7 @@
|
||||||
|
#ifndef _DL_RELOCATE_LD_H
|
||||||
|
#define _DL_RELOCATE_LD_H
|
||||||
|
|
||||||
|
-/* Return true if dynamic section in the shared library L should be
|
||||||
|
- relocated. */
|
||||||
|
-
|
||||||
|
-static inline bool
|
||||||
|
-dl_relocate_ld (const struct link_map *l)
|
||||||
|
-{
|
||||||
|
- /* Don't relocate dynamic section if it is readonly */
|
||||||
|
- return !l->l_ld_readonly;
|
||||||
|
-}
|
||||||
|
+/* The dynamic section is writable. */
|
||||||
|
+#define DL_RO_DYN_SECTION 0
|
||||||
|
|
||||||
|
#endif /* _DL_RELOCATE_LD_H */
|
||||||
|
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||||
|
index ed10953f34b96c49..fcbbf6974827cdf1 100644
|
||||||
|
--- a/sysdeps/generic/ldsodefs.h
|
||||||
|
+++ b/sysdeps/generic/ldsodefs.h
|
||||||
|
@@ -69,6 +69,16 @@ __BEGIN_DECLS
|
||||||
|
`ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'. */
|
||||||
|
#define ELFW(type) _ElfW (ELF, __ELF_NATIVE_CLASS, type)
|
||||||
|
|
||||||
|
+/* Return true if dynamic section in the shared library L should be
|
||||||
|
+ relocated. */
|
||||||
|
+
|
||||||
|
+static inline bool
|
||||||
|
+dl_relocate_ld (const struct link_map *l)
|
||||||
|
+{
|
||||||
|
+ /* Don't relocate dynamic section if it is readonly */
|
||||||
|
+ return !(l->l_ld_readonly || DL_RO_DYN_SECTION);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* All references to the value of l_info[DT_PLTGOT],
|
||||||
|
l_info[DT_STRTAB], l_info[DT_SYMTAB], l_info[DT_RELA],
|
||||||
|
l_info[DT_REL], l_info[DT_JMPREL], and l_info[VERSYMIDX (DT_VERSYM)]
|
||||||
|
diff --git a/sysdeps/mips/dl-relocate-ld.h b/sysdeps/mips/dl-relocate-ld.h
|
||||||
|
index 0c18d9a567cad54f..376ad75dd1695fe3 100644
|
||||||
|
--- a/sysdeps/mips/dl-relocate-ld.h
|
||||||
|
+++ b/sysdeps/mips/dl-relocate-ld.h
|
||||||
|
@@ -19,14 +19,7 @@
|
||||||
|
#ifndef _DL_RELOCATE_LD_H
|
||||||
|
#define _DL_RELOCATE_LD_H
|
||||||
|
|
||||||
|
-/* Return true if dynamic section in the shared library L should be
|
||||||
|
- relocated. */
|
||||||
|
-
|
||||||
|
-static inline bool
|
||||||
|
-dl_relocate_ld (const struct link_map *l)
|
||||||
|
-{
|
||||||
|
- /* Never relocate dynamic section. */
|
||||||
|
- return false;
|
||||||
|
-}
|
||||||
|
+/* The dynamic section is readonly. */
|
||||||
|
+#define DL_RO_DYN_SECTION 1
|
||||||
|
|
||||||
|
#endif /* _DL_RELOCATE_LD_H */
|
||||||
|
diff --git a/sysdeps/riscv/dl-relocate-ld.h b/sysdeps/riscv/dl-relocate-ld.h
|
||||||
|
index 10327454b17a7097..2ab2b8ac6c09af82 100644
|
||||||
|
--- a/sysdeps/riscv/dl-relocate-ld.h
|
||||||
|
+++ b/sysdeps/riscv/dl-relocate-ld.h
|
||||||
|
@@ -19,14 +19,7 @@
|
||||||
|
#ifndef _DL_RELOCATE_LD_H
|
||||||
|
#define _DL_RELOCATE_LD_H
|
||||||
|
|
||||||
|
-/* Return true if dynamic section in the shared library L should be
|
||||||
|
- relocated. */
|
||||||
|
-
|
||||||
|
-static inline bool
|
||||||
|
-dl_relocate_ld (const struct link_map *l)
|
||||||
|
-{
|
||||||
|
- /* Never relocate dynamic section for ABI compatibility. */
|
||||||
|
- return false;
|
||||||
|
-}
|
||||||
|
+/* The dynamic section is readonly for ABI compatibility. */
|
||||||
|
+#define DL_RO_DYN_SECTION 1
|
||||||
|
|
||||||
|
#endif /* _DL_RELOCATE_LD_H */
|
30
glibc-upstream-2.34-43.patch
Normal file
30
glibc-upstream-2.34-43.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
commit 6548a9bdba95b3e1fcdbd85445342467e4b0cd4f
|
||||||
|
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||||
|
Date: Fri Sep 24 08:56:42 2021 -0700
|
||||||
|
|
||||||
|
Avoid warning: overriding recipe for .../tst-ro-dynamic-mod.so
|
||||||
|
|
||||||
|
Add tst-ro-dynamic-mod to modules-names-nobuild to avoid
|
||||||
|
|
||||||
|
../Makerules:767: warning: ignoring old recipe for target '.../elf/tst-ro-dynamic-mod.so'
|
||||||
|
|
||||||
|
This updates BZ #28340 fix.
|
||||||
|
|
||||||
|
(cherry picked from commit 15e6d6785ac2935bb963506b47a37b3d1f728952)
|
||||||
|
|
||||||
|
diff --git a/elf/Makefile b/elf/Makefile
|
||||||
|
index de854b4d1a815bd3..118d579c42c38110 100644
|
||||||
|
--- a/elf/Makefile
|
||||||
|
+++ b/elf/Makefile
|
||||||
|
@@ -399,8 +399,9 @@ endif
|
||||||
|
modules-execstack-yes = tst-execstack-mod
|
||||||
|
extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
|
||||||
|
|
||||||
|
-# filtmod1.so, tst-big-note-lib.so have special rules.
|
||||||
|
-modules-names-nobuild := filtmod1 tst-big-note-lib
|
||||||
|
+# filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special
|
||||||
|
+# rules.
|
||||||
|
+modules-names-nobuild := filtmod1 tst-big-note-lib tst-ro-dynamic-mod
|
||||||
|
|
||||||
|
tests += $(tests-static)
|
||||||
|
|
26
glibc.spec
26
glibc.spec
@ -151,7 +151,7 @@ end \
|
|||||||
Summary: The GNU libc libraries
|
Summary: The GNU libc libraries
|
||||||
Name: glibc
|
Name: glibc
|
||||||
Version: %{glibcversion}
|
Version: %{glibcversion}
|
||||||
Release: 7%{?dist}
|
Release: 8%{?dist}
|
||||||
|
|
||||||
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
||||||
# libraries.
|
# libraries.
|
||||||
@ -264,6 +264,16 @@ Patch61: glibc-upstream-2.34-30.patch
|
|||||||
Patch62: glibc-upstream-2.34-31.patch
|
Patch62: glibc-upstream-2.34-31.patch
|
||||||
Patch63: glibc-upstream-2.34-32.patch
|
Patch63: glibc-upstream-2.34-32.patch
|
||||||
Patch64: glibc-upstream-2.34-33.patch
|
Patch64: glibc-upstream-2.34-33.patch
|
||||||
|
Patch65: glibc-upstream-2.34-34.patch
|
||||||
|
Patch66: glibc-upstream-2.34-35.patch
|
||||||
|
Patch67: glibc-upstream-2.34-36.patch
|
||||||
|
Patch68: glibc-upstream-2.34-37.patch
|
||||||
|
Patch69: glibc-upstream-2.34-38.patch
|
||||||
|
Patch70: glibc-upstream-2.34-39.patch
|
||||||
|
Patch71: glibc-upstream-2.34-40.patch
|
||||||
|
Patch72: glibc-upstream-2.34-41.patch
|
||||||
|
Patch73: glibc-upstream-2.34-42.patch
|
||||||
|
Patch74: glibc-upstream-2.34-43.patch
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Continued list of core "glibc" package information:
|
# Continued list of core "glibc" package information:
|
||||||
@ -2295,6 +2305,20 @@ fi
|
|||||||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Nov 3 2021 Florian Weimer <fweimer@redhat.com> - 2.34-8
|
||||||
|
- Sync with upstream branch release/2.34/master,
|
||||||
|
commit 6548a9bdba95b3e1fcdbd85445342467e4b0cd4f:
|
||||||
|
- Avoid warning: overriding recipe for .../tst-ro-dynamic-mod.so
|
||||||
|
- ld.so: Initialize bootstrap_map.l_ld_readonly [BZ #28340]
|
||||||
|
- ld.so: Replace DL_RO_DYN_SECTION with dl_relocate_ld [BZ #28340]
|
||||||
|
- Handle NULL input to malloc_usable_size [BZ #28506]
|
||||||
|
- elf: Avoid deadlock between pthread_create and ctors [BZ #28357]
|
||||||
|
- timex: Use 64-bit fields on 32-bit TIMESIZE=64 systems (BZ #28469)
|
||||||
|
- y2038: Use a common definition for stat for sparc32
|
||||||
|
- elf: Replace nsid with args.nsid [BZ #27609]
|
||||||
|
- S390: Add PCI_MIO and SIE HWCAPs
|
||||||
|
- support: Also return fd when it is 0
|
||||||
|
|
||||||
* Fri Oct 1 2021 Florian Weimer <fweimer@redhat.com> - 2.34-7
|
* Fri Oct 1 2021 Florian Weimer <fweimer@redhat.com> - 2.34-7
|
||||||
- Drop glibc-rh1992702-*.patch, applied upstream. (#1992702)
|
- Drop glibc-rh1992702-*.patch, applied upstream. (#1992702)
|
||||||
- Sync with upstream branch release/2.34/master,
|
- Sync with upstream branch release/2.34/master,
|
||||||
|
Loading…
Reference in New Issue
Block a user