gold: ensure file_counts_lock is initialized before using
authorNick Gasson <nick.gasson@arm.com>
Mon, 2 Nov 2020 04:02:05 +0000 (12:02 +0800)
committerAlan Modra <amodra@gmail.com>
Tue, 3 Nov 2020 00:04:51 +0000 (10:34 +1030)
commitaf61e84fd2d6eca1273f1d24b8d7b89c5a1441e5
tree76c58de8be2981ecd2fdb75fe50f774f61b8639d
parent0dd05d40de4e935cec7f8a8ab6c07f7382ef1277
gold: ensure file_counts_lock is initialized before using

Since upgrading to binutils 2.35 I've been experiencing random memory
corruption related crashes with ld.gold --threads. It's caused by
multiple threads concurrently pushing elements onto the shared
std::vector in File_read::record_file_read(). This vector is supposed to
be protected by file_counts_lock, but that is initialized lazily and
might be NULL when File_read::open() is called, in which case
Hold_optional_lock silently skips locking it.

Fix by calling the initialize() method before attempting to acquire the
lock, the same as other places that use file_counts_lock.

PR 26827
* fileread.cc (File_read::open): Ensure file_counts_lock is
initialized.
* testsuite/Makefile.am (check_PROGRAMS): Add a test that passes
-Wl,--threads.
* testsuite/Makefile.in: Regenerate.
gold/ChangeLog
gold/fileread.cc
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in