pthread_cancel fails with "RT33" with musl libc

Bug #1895305 reported by Luca Weiss
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
QEMU
Invalid
Undecided
Unassigned

Bug Description

From my testing it seems that QEMU built against musl libc crashes on pthread_cancel cancel calls - if the binary is also built with musl libc.

Minimal sample:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* threadfunc(void* ignored) {
 while (1) {
  pause();
 }
 return NULL;
}
int main() {
 pthread_t thread;
 pthread_create(&thread, NULL, &threadfunc, NULL);
 sleep(1);
 pthread_cancel(thread);
 printf("OK, alive\n");
}

In an Alpine Linux aarch64 chroot (on an x86_64 host) the binary will just output RT33 and has exit code 161.

Using qemu-aarch64 on an x86_64 host results in the output (fish shell)
  fish: “qemu-aarch64-static ./musl-stat…” terminated by signal Unknown (Unknown)
or (bash)
  Real-time signal 2

and exit code 164.

It doesn't matter whether the binary is linked dynamically or static. You can see my test results in the following table:

| | QEMU glibc | QEMU musl |
|----------------------|------------|-----------|
| binary glibc dynamic | ✓ | ✓ |
| binary glibc static | ✓ | ✓ |
| binary musl dynamic | ✓ | ✗ |
| binary musl static | ✓ | ✗ |

Both QEMU builds are v5.1.0 (glibc v2.32 / musl v1.2.1)

I've uploaded all my compile and test commands (plus a script to conveniently run them all) to https://github.com/z3ntu/qemu-pthread_cancel . It also includes the built binaries if needed. The test script output can be found at https://github.com/z3ntu/qemu-pthread_cancel/blob/master/results.txt

Further links:
- https://gitlab.com/postmarketOS/pmaports/-/issues/190#note_141902075
- https://gitlab.com/postmarketOS/pmbootstrap/-/issues/1970

Tags: linux-user
tags: added: linux-user
Revision history for this message
Ariadne Conill (kaniini) wrote :

This was a downstream regression in Alpine caused by an attempt to make older Go binaries work under emulation. We have reverted the patch there.

Revision history for this message
Thomas Huth (th-huth) wrote :

Ok, thanks, since this was a regressin in Alpine, I'm marking the bug as closed here.

Changed in qemu:
status: New → Invalid
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.