> aha: gajim is calling setproctitle via ctypes, which dlopen()'s libc.so
> (without a specific version number). ld.so is picking the latest and
> loading it, but libc.so.98.0 was already loaded, so we hit msyscall
> error.

Time to explain the msyscall thing a bit.

msyscall(2) will go away after release, since pinsyscalls(2) has
replaced it.  msyscall(2) was the first mechanism for "range of memory
where system calls occur from", pinsyscalls(2) is the new mechanism with
"precise entry points for system calls".

The failure to msyscall(2) prints a warning message in ld.so.  But the
failure of pinsyscalls(2) in ld.so does not print a warning message.
However the pinsyscalls(2) failure is visible in the ktrace.  Both of
them fail.

The reality is if a system call is called from that 2nd libc.so library
mapping, the process will exit hard with SIGABRT.  It isn't the msyscall message
that matters here, but that you simply can't have another region
containing the ability to call system calls.


ld.so was modified to coerce additional "libc.so" mapping requests
into reusing the first libc.so choice made by ld.so.

The ld.so/loader.c logic has not chosen to do that in this case, and I
can't see why that didn't happen.  There's two bugs, really.

1. the application chose to load another library version, because it is
   compiled or discovered somehow.  We cannot find and fix all those cases
   because programs do really weird things to get those library names.

2. ld.so must do the job of coercing all "libc.so*" requests to the original
   libc.so choice, and the ld.so diff isn't sufficient for this case.

We can't fix 1, so #2 is what kettenis has been trying to do.




Reply via email to