5

I'm on Ubuntu Desktop 25.04 with amd64 architecture. I'm trying to run Piracálculos, a game made for the OLPC XO. I downloaded the .xo file, renamed it to .zip, extracted it, and then tried to work with the sugarPiracalculos file at /Piracalculos.activity/bin/. First few tries running it, it exited asking for some dependencies, which I resolved (see below). Afterward, the game refuses to run giving std::logic_error. Running strace doesn't clear things up. Maybe it's a code logic error? However, no source code exists to my knowledge, so I can't fix such error. Thus, I ask: Is there a way to bypass it or at least find out what's causing it?

Dependencies (last one might be unnecessary):

sudo apt install libsdl1.2-dev:i386 libsdl-image1.2-dev:i386 libsdl-mixer1.2-dev:i386 libsdl-ttf2.0-dev:i386

Also make these edits to sugarPiracalculos:

export LD_PRELOAD="$SUGAR_BUNDLE_PATH/lib/libsugarize.so" -> export LD_PRELOAD=/path/to/libsugarize.so # file is at /Piracalculos.activity/lib/libsugarize.so
exec piracalculos -> exec /path/to/piracalculos

Output of strace -e file ./piracalculos:

execve("./piracalculos", ["./piracalculos"], 0x7ffdce204fc0 /* 49 vars */) = 0
[ Process PID=36884 runs in 32 bit mode. ]
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=129819, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libSDL-1.2.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=186044, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libSDL_mixer-1.2.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=200792, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libSDL_image-1.2.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=63008, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libstdc++.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=2648292, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libm.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=1164800, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libgcc_s.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=222888, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0755, stx_size=2358236, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libmikmod.so.3", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=311688, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libfluidsynth.so.3", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=603664, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libvorbisfile.so.3", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=42236, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libFLAC.so.14", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=476532, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libmad.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=99688, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libpng16.so.16", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=247200, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libjpeg.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=599504, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libtiff.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=603560, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libwebp.so.7", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=566880, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libSDL2-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=2112324, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libopenal.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=1591392, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libgomp.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=363044, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libglib-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=1546416, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libsndfile.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=654520, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libpulse-simple.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=17900, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libpulse.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=379180, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libasound.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=1271540, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libjack.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=370304, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libpipewire-0.3.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=903084, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libdbus-1.so.3", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=394752, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libgmodule-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=17868, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libinstpatch-1.0.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=829488, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libgobject-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=427572, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libreadline.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=332308, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libvorbis.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=173364, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libogg.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=34044, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libz.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=108052, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libzstd.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=796008, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/liblzma.so.5", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=218528, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libjbig.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=61520, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libdeflate.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=91464, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libsharpyuv.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=30108, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libsamplerate.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=1496604, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libX11.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=1393588, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXext.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=84268, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXcursor.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=46632, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXi.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=79488, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXfixes.so.3", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=25944, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXrandr.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=54776, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXss.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=13788, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libdrm.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=99964, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libgbm.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=18000, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libwayland-egl.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=13628, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libwayland-client.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=59396, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libwayland-cursor.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=30608, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libxkbcommon.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=317064, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libdecor-0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=34388, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libatomic.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=26036, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libpcre2-8.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=726708, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libvorbisenc.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=570704, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libopus.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=3532288, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libmpg123.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=420892, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libmp3lame.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=307960, ...}) = 0
openat(AT_FDCWD, "/usr/lib/i386-linux-gnu/pulseaudio/libpulsecommon-17.0.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=583232, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libdb-5.3.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=2062528, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libsystemd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=1174776, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libffi.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=38520, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libtinfo.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=190664, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libxcb.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=181844, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXrender.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=50824, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libexpat.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=177616, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libX11-xcb.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=13464, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libasyncns.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=25852, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libapparmor.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=83792, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libcap.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=46644, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXau.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=17864, ...}) = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libXdmcp.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=26000, ...}) = 0
openat(AT_FDCWD, "/sys/devices/system/cpu/possible", O_RDONLY|O_CLOEXEC) = 3
readlink("/proc/self/exe", "/home/sysadmin/Downloads/Games/P"..., 4096) = 95
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct null not valid
--- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=36884, si_uid=1000} ---
+++ killed by SIGABRT (core dumped) +++
Aborted (core dumped)

UPDATE:

Thanks to another user from an entirely different site for finding what SUGAR_ACTIVITY_ROOT should be set to and more. (Yes, I cross-posted, and yes, I'm beyond ashamed.)

Said folder is where the program writes stuff to. It's divided into three subfolders: data (akin to HOME), tmp (like /tmp), and instance (think /var/tmp). For the purposes of simply running the game, it's enough to add in sugarPiracalculos the following along with the other exports: export SUGAR_ACTIVITY_ROOT=/path/to/Piracalculos.activity/ . And then create the aforementioned three subfolders inside that path.

Now, that alone won't get the game running. There's another export that is needed: SUGAR_BUNDLE_PATH. That's the folder where the program stores its binaries, assets, libraries, etc. Like before, this has to be added to sugarPiracalculos: export SUGAR_BUNDLE_PATH=/path/to/Piracalculos.activity . And, before the exec part in that script, it's needed to add cd "$SUGAR_BUNDLE_PATH".

The dependencies and this, at least on my end, was all that was needed to properly boot up Piracálculos, the nearly decade long lost OLPC XO game. Thanks so much everyone for your immeasurable help!

  • 1
    No current version of Ubuntu runs 32 bit code. – David DE Aug 22 '25 at 11:52
  • 3
    You can with dpkg --add-architecture i386, though? – Dilan Zelsky Aug 22 '25 at 11:59
  • 1
    Care to elaborate what kind of information I'm missing? I don't mind adding details, but I wasn't sure what to include, or if it would even matter since anyone can download the file and look at it themselves. Do I include distro, architecture, version, something else? Please let me know, I want to provide all the necessary information. – Dilan Zelsky Aug 22 '25 at 12:42
  • 1
    deb packages are built for specific product/releases, and you've not told us yours. The starting point is what Ubuntu product you're using (eg. Ubuntu Core, Ubuntu Server, Ubuntu Desktop, or a flavor of Ubuntu), and what release you're using, eg. Ubuntu Core 22, Ubuntu Server 24.04 LTS, Ubuntu Desktop 25.04, or Xubuntu 25.04... that is the starting point; the architecture is the amd64, s390x, arm64, ppc64el, riscv64 etc.. as amd64 allows i386 however the 32-bit version of arm64 is armhf... – guiverc Aug 22 '25 at 12:46
  • 2
    If you need to know what kind of information you are missing, read [ask] then edit your question accordingly - always assuming of course that it is on topic – graham Aug 22 '25 at 12:54
  • @guiverc Updated the post to include that information. Thank you very much for elaborating. I understand now why it was important to include all that. – Dilan Zelsky Aug 22 '25 at 14:09
  • @steeldriver I did all that, actually, yet here I am. Not that those resources are unhelpful, just that they wasn't specific enough for me to notice I was missing such basic but crucial information. Or maybe they do say and I simply didn't read properly. In that case, my bad. – Dilan Zelsky Aug 22 '25 at 14:14

1 Answers1

5

OK so on a hunch I ran the binary piracalculos file through strings and looked for anything that might be an environment variable that the program expects to find:

$ strings ./piracalculos | grep -Ex '[[:upper:]][[:upper:]_]+'
WVSQ
CHDV
CHDV
SUGAR_ACTIVITY_ROOT

I don't know what SUGAR_ACTIVITY_ROOT should be set to, but it appears that just exporting the variable is sufficient to suppress the error.

TL;DR

  • the what(): basic_string::_S_construct null not valid error is because the program tries to construct a string object from a null pointer

  • the null pointer is possibly coming from a C library call like getenv("SUGAR_ACTIVITY_ROOT") when the process's environment contains no such variable: from man getenv:

     RETURN VALUE
            The getenv() function returns a pointer to the value in  the  envi‐
            ronment, or NULL if there is no match.
    

You may of course get other errors.

steeldriver
  • 143,099
  • Woah, that... Actually did it! Well, not quite. A black window appears. But still, hats off to you for clearing this roadblock. Now I'm getting "Error: Couldn't open assets/.../ASSET: No such file or directory". The game can't find its own assets folder. I believe this is the final hurdle to this near decade long lost game. Should I create a new question about that problem and close this one, or update the question to include this? – Dilan Zelsky Aug 22 '25 at 18:44
  • Nevermind that, this is solved. The assets problem is something else. Thank you so much y'all for your help! – Dilan Zelsky Aug 22 '25 at 19:03
  • 2
    @DilanZelsky Would you be able to share a very brief outline of how you fixed the assets problem so if someone else reads this in the future with the same problem they can also find an answer? Well done for getting it working though! – niemiro Aug 22 '25 at 21:03
  • Sugar) is the user interface for the OLPC that's a bit more child-appropriate than the mess of overlapping windows and desktops full of manila folders. – Simon Richter Aug 23 '25 at 04:02
  • 1
    @niemiro Done. Added an "update" at the end of the question. – Dilan Zelsky Aug 23 '25 at 14:17