shkhln / linuxulator-steam-utils

Steam launcher for FreeBSD
MIT License
125 stars 12 forks source link

Palworld fails to start #127

Open amshafer opened 5 months ago

amshafer commented 5 months ago

I see the following when starting palworld:

shim_epoll_create1 is not implemented
0x6bd505f4 <shim_epoll_create1_GLIBC_2_9+0x44> at /usr/local/lib/libc6-shim/libc6.so
0x70c441fa <_ZN8tinyxml210XMLPrinter5VisitERKNS_10XMLUnknownE+0x11a8ba> at /usr/home/ashafer/.steam/steam/linux64/steamclient.so
0x70bb3528 <_ZN8tinyxml210XMLPrinter5VisitERKNS_10XMLUnknownE+0x89be8> at /usr/home/ashafer/.steam/steam/linux64/steamclient.so
0x70c1691b <_ZN8tinyxml210XMLPrinter5VisitERKNS_10XMLUnknownE+0xecfdb> at /usr/home/ashafer/.steam/steam/linux64/steamclient.so
0x70c1ffa1 <_ZN8tinyxml210XMLPrinter5VisitERKNS_10XMLUnknownE+0xf6661> at /usr/home/ashafer/.steam/steam/linux64/steamclient.so
0x705f59b9 <Breakpad_SteamWriteMiniDumpUsingExceptionInfoWithBuildId+0xaeb09> at /usr/home/ashafer/.steam/steam/linux64/steamclient.so
0x7051a3da <Steam_NotifyMissingInterface+0x346c1a> at /usr/home/ashafer/.steam/steam/linux64/steamclient.so
0x701f10ef <Steam_NotifyMissingInterface+0x1d92f> at /usr/home/ashafer/.steam/steam/linux64/steamclient.so
0x701d0aba <Steam_GSGetSteamID+0x1ac6da> at /usr/home/ashafer/.steam/steam/linux64/steamclient.so
0x6eed7bde <winISteamClient_SteamClient020_GetISteamGenericInterface+0x7e> at /usr/home/ashafer/.steam/steam/compatibilitytools.d/FreeBSD_Proton/proton_8.0/dist/lib64//wine/x86_64-unix/lsteamclient.dll.so
Assertion failed: (0), function shim_epoll_create1, file build/wrappers64.c, line 14215.
017c:warn:seh:dispatch_exception backtrace: --- Exception 0x80000101.

I'm assuming the shim_epoll_create1 message at the top comes from libc6-shim? Does this look right? I thought we had already shimmed all the epoll functions, but maybe we don't since epoll is in base now? It does look like wrappers64.c has it marked unimplemented.

Here's the full log. uname is FreeBSD mick 15.0-CURRENT FreeBSD 15.0-CURRENT #14 main-n267477-8338ea1d3cc7: Mon Jan 15 19:35:14 EST 2024 ashafer@mick:/usr/obj/usr/freebsd-src/amd64.amd64/sys/GENERIC-NODEBUG amd64.

As usual I'm running a non-standard nv driver, but I've verified 32/64bit linux graphics programs can launch along with verifying wine-proton is functional.

Thanks!

amshafer commented 5 months ago

Updating with some details from offline discussion. It seems that whatever steam runtime I have is calling new things that libc6-shim didn't yet have, specifically epoll_create, localeconv, and getcontext. Adding all three of those isn't that bad.

After that my latest crashes come from ~/.steam/steam/linux64/crashhandler.so calling the gettid syscall directly without calling into libc (and the shim). Which is what fails with the SIGSYS and a ENOSYS errno.

Here's the bit from crashhandler.so:

LAB_00146690                                    XREF[1]:     0014666f(j)  
        00146690 48 8d 84        LEA        RAX=>local_218,[RSP + 0x440]
                 24 40 04 
                 00 00
        00146698 ba ba 00        MOV        EDX,0xba
                 00 00
        0014669d b9 40 00        MOV        ECX,0x40
                 00 00
        001466a2 48 8b b4        MOV        RSI,qword ptr [RSP + local_4e0]
                 24 78 01 
                 00 00
        001466aa 48 89 c7        MOV        RDI,RAX
        001466ad 89 d0           MOV        EAX,EDX
        001466af f3 48 a5        MOVSQ.REP  RDI,RSI
        001466b2 0f 05           SYSCALL

Been a while since I did anything close to reverse engineering, but to me it looks like steam is putting 0xba (syscall number for gettid) in eax and then doing the syscall directly so libc6-shim has no chance to intercept, so there's not much we can do.