Just bought Silicon Zeroes (I know I’m late to the game, been too busy in Zachtronics land) and I’m met with this screen…

Well it’s not a great first start experience, but luckily someone encountered a similar problem in 2018: github.com/PleasingFungus/Silicon-Zeroes/issues/127

But hey, at least it’s better than Prime Mover which crashes on startup without any indication to why. I even looked at the strace attempts, but that’s not the game this post is about.

So with that, I’m mostly making this post for my own reference down the road, and as a guide for those who don’t immediately understand how an LD_PRELOAD library works.

Fix it

Drop the code in a .c file:

// gcc -shared -fpic -Os -o /tmp/Si0s.so this.c -ldl
#define _GNU_SOURCE 1
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>

int FMOD_System_GetNumDrivers(void *, int *);
int FMOD_System_GetDriverInfo(void *, int, char *, int, void *, int *, int *, int *);
int FMOD_System_SetDriver(void *, int);

int FMOD_System_Create(void** sys)
{
  __typeof(FMOD_System_Create) *real_create = dlsym(RTLD_NEXT, "FMOD_System_Create");
  if (!real_create) {
    fprintf(stderr, "dlsym: %s\n", dlerror());
    abort();
  }
  int ret, drv, numdrv;
  if ((ret = real_create(sys)))
    return ret;
  const char *drvstr = getenv("FMODSUX_SETDRIVER");
  if (drvstr && sscanf(drvstr, "%d", &drv) == 1)
    FMOD_System_SetDriver(*sys, drv);
  else if (!FMOD_System_GetNumDrivers(*sys, &numdrv))
    for (drv = 0; drv < numdrv; drv++) {
      char namebuf[50];
      int rate, mode, nch;
      if (!FMOD_System_GetDriverInfo(*sys, drv, namebuf, sizeof namebuf, 0, &rate, &mode, &nch))
	printf("%2d: mode %d, %d/%dch: %s\n", drv, mode, rate, nch, namebuf);
    }
  return 0;
}

Now compile that into a shared library for our system:

gcc -shared -fpic -Os -o $HOME/SOME/PATH/Si0s.so THAT_FILE.c -ldl

Of course you should replace the path with somewhere that you’ll remember why it’s there.

Then in your launch options, set the LD_PRELOAD envvar there:

LD_PRELOAD=$HOME/???/Si0s.so %command%, s/???/wherever you put the compiled file.

And now you should be good to go!

Perhaps this should be added to the game’s libraries…

If the dev ever reads this, just edit SiliconZeroes.sh:

diff --git a/SiliconZeroes.sh b/SiliconZeroes.sh.new
index d4c717d..9488d13 100755
--- a/SiliconZeroes.sh
+++ b/SiliconZeroes.sh.new
@@ -1,3 +1,4 @@
 #!/bin/sh
 export LD_LIBRARY_PATH="libraries:$LD_LIBRARY_PATH"
+export LD_PRELOAD="libraries/fmodsounddevfix.so $LD_PRELOAD"
 exec ./rawexec "$@"

And distribute a copy of that library with the fixed function override.

VLHCC 2019: My personal rankings

Stuff I found interesting from the IEEE VLHCC conference in Memphis, TN
Continue reading...

Beat Saber Mods and Linux

Published on August 15, 2019

Atom Package Development Tricks for Linux

Published on May 20, 2019