elf/tests: Make thrlock and noload depend on libm

Message ID 20210707165859.2993732-1-siddhesh@sourceware.org
State Committed
Commit 5ceb1630bdb2302f927fabb812252a6d88168918
Headers
Series elf/tests: Make thrlock and noload depend on libm |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

Siddhesh Poyarekar July 7, 2021, 4:58 p.m. UTC
  Both tests try to dlopen libm.so at runtime, so make them depend on it
to avoid running before libm.so is built.
---
 elf/Makefile | 2 ++
 1 file changed, 2 insertions(+)
  

Comments

Florian Weimer July 7, 2021, 5:06 p.m. UTC | #1
* Siddhesh Poyarekar via Libc-alpha:

> Both tests try to dlopen libm.so at runtime, so make them depend on it
> to avoid running before libm.so is built.

Can that really happen in the current build system?

It's still value to re-run the tests after libm has changed, so the
patch looks okay to me (only the justification is lacking).

Thanks,
Florian
  
Siddhesh Poyarekar July 7, 2021, 5:22 p.m. UTC | #2
On 7/7/21 10:36 PM, Florian Weimer via Libc-alpha wrote:
> * Siddhesh Poyarekar via Libc-alpha:
> 
>> Both tests try to dlopen libm.so at runtime, so make them depend on it
>> to avoid running before libm.so is built.
> 
> Can that really happen in the current build system?

I don't the exact sequence of events, but I did run into this a few 
minutes ago, which is how I realized there was a missing dependency. 
The tests failed with "file too short", which was probably them racing 
with the static linker linking libm.so.

Siddhesh
  
Florian Weimer July 8, 2021, 5:46 a.m. UTC | #3
* Siddhesh Poyarekar:

> On 7/7/21 10:36 PM, Florian Weimer via Libc-alpha wrote:
>> * Siddhesh Poyarekar via Libc-alpha:
>> 
>>> Both tests try to dlopen libm.so at runtime, so make them depend on it
>>> to avoid running before libm.so is built.
>> Can that really happen in the current build system?
>
> I don't the exact sequence of events, but I did run into this a few
> minutes ago, which is how I realized there was a missing dependency. 
> The tests failed with "file too short", which was probably them racing
> with the static linker linking libm.so.

Hmm.  I would expect that recursive make running in elf subdirectory
simply does not have the knowledge how to link libm properly.  And it
will definitely not do that while running tests.

Thanks,
Florian
  
Siddhesh Poyarekar July 8, 2021, 6:01 a.m. UTC | #4
On 7/8/21 11:16 AM, Florian Weimer wrote:
> * Siddhesh Poyarekar:
> 
>> On 7/7/21 10:36 PM, Florian Weimer via Libc-alpha wrote:
>>> * Siddhesh Poyarekar via Libc-alpha:
>>>
>>>> Both tests try to dlopen libm.so at runtime, so make them depend on it
>>>> to avoid running before libm.so is built.
>>> Can that really happen in the current build system?
>>
>> I don't the exact sequence of events, but I did run into this a few
>> minutes ago, which is how I realized there was a missing dependency.
>> The tests failed with "file too short", which was probably them racing
>> with the static linker linking libm.so.
> 
> Hmm.  I would expect that recursive make running in elf subdirectory
> simply does not have the knowledge how to link libm properly.  And it
> will definitely not do that while running tests.

My mental model of how this works is that make builds dependency trees 
and then runs independent trees in parallel.  In that model, if tests 
don't have that dependency, they may end up in a different dependency 
tree from that of libm and both could then happen in parallel.  Of 
course, I don't actually know if that's how make works because I haven't 
read the sources.

Oh, and running only tests (assuming that all built objects are up to 
date) won't do this.  It'll only happen if some object needs to be 
updated when the test is run because an undercaffeinated developer ran 
make check instead of make && make check :)

Siddhesh
  
Florian Weimer July 8, 2021, 6:09 a.m. UTC | #5
* Siddhesh Poyarekar:

> Oh, and running only tests (assuming that all built objects are up to
> date) won't do this.  It'll only happen if some object needs to be 
> updated when the test is run because an undercaffeinated developer ran
> make check instead of make && make check :)

If you do that, you'll likely end up with corrupt objects anyway.
I think some assert in allocatestack.c is particularly common
(or at least was when we still had a separate libpthread).  It
definitely invalidates testing.

We really need to fix that, but the dependency won't help with that.
(But as I said, adding the dependency is correct, just the commit
message is misleading.)

Thanks,
Florian
  
Siddhesh Poyarekar July 8, 2021, 6:12 a.m. UTC | #6
On 7/8/21 11:39 AM, Florian Weimer via Libc-alpha wrote:
> * Siddhesh Poyarekar:
> 
>> Oh, and running only tests (assuming that all built objects are up to
>> date) won't do this.  It'll only happen if some object needs to be
>> updated when the test is run because an undercaffeinated developer ran
>> make check instead of make && make check :)
> 
> If you do that, you'll likely end up with corrupt objects anyway.
> I think some assert in allocatestack.c is particularly common
> (or at least was when we still had a separate libpthread).  It
> definitely invalidates testing.
> 
> We really need to fix that, but the dependency won't help with that.
> (But as I said, adding the dependency is correct, just the commit
> message is misleading.)

OK, I'll update the commit message to say:

Both tests try to dlopen libm.so at runtime, so make them depend on it 
so that they're executed if libm.so has been updated.

Siddhesh
  
Florian Weimer July 8, 2021, 6:15 a.m. UTC | #7
* Siddhesh Poyarekar:

> On 7/8/21 11:39 AM, Florian Weimer via Libc-alpha wrote:
>> * Siddhesh Poyarekar:
>> 
>>> Oh, and running only tests (assuming that all built objects are up to
>>> date) won't do this.  It'll only happen if some object needs to be
>>> updated when the test is run because an undercaffeinated developer ran
>>> make check instead of make && make check :)
>> If you do that, you'll likely end up with corrupt objects anyway.
>> I think some assert in allocatestack.c is particularly common
>> (or at least was when we still had a separate libpthread).  It
>> definitely invalidates testing.
>> We really need to fix that, but the dependency won't help with that.
>> (But as I said, adding the dependency is correct, just the commit
>> message is misleading.)
>
> OK, I'll update the commit message to say:
>
> Both tests try to dlopen libm.so at runtime, so make them depend on it
> so that they're executed if libm.so has been updated.

Thanks. 8-)

Florian
  

Patch

diff --git a/elf/Makefile b/elf/Makefile
index b1e01d9516..4b320e8b3a 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -1281,6 +1281,8 @@  tst-leaks1-ENV = MALLOC_TRACE=$(objpfx)tst-leaks1.mtrace
 tst-leaks1-static-ENV = MALLOC_TRACE=$(objpfx)tst-leaks1-static.mtrace
 
 $(objpfx)tst-thrlock: $(shared-thread-library)
+$(objpfx)tst-thrlock.out: $(libm)
+$(objpfx)tst-noload.out: $(libm)
 
 tst-tst-dlopen-tlsmodid-no-pie = yes
 $(objpfx)tst-dlopen-tlsmodid: $(shared-thread-library)