Linux Game doesn't launch when uploaded to Steam, needs libraries [Solved]

Phoebe Klim

Member
EDIT: If you're trying to use my solution also check this thread out:

Hey, can someone GameMaker + Linux + Steamworks savvy help me figure out what to do? I'm trying to upload Linux build and it's not going well, supposedly Steam uses "outdated libraries", whatever that means...

I use Xubuntu virtual machine, created following a guide, and the game seems to work properly when I launch it from GameMaker in VM.

However when I upload it to Steam, the game doesn't launch: It shows [Game name] - Launching, then [Game name] - Running for a millisecond, and then nothing.

One of my players supposedly found a solution:

I see error when run steam through terminal on my Ubuntu 18.04:

/mnt/cf2559cf-8e14-4082-b684-a802a8093199/SteamLibrary/steamapps/common/Sector Six/SectorSix: /home/volnes/.local/share/Steam/ubuntu12_32/steam-runtime/pinned_libs_64/libcurl.so.4: version `CURL_OPENSSL_4' not found (required by /mnt/cf2559cf-8e14-4082-b684-a802a8093199/SteamLibrary/steamapps/common/Sector Six/SectorSix)

old libraries from steam...
Well yes, found solution on my ubuntu 18.04.3:
1)Moving to folder
/home/$USER/.local/share/Steam/ubuntu12_32/steam-runtime/pinned_libs_64/
2) Rename lib libcurl.so.4 to libcurl.so.4.backup
3) ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4 libcurl.so.4
4) PROFIT!
The player has managed to get the game running.

Then I went to Steamworks developer discussions with this info and I've got this answer:

Can I fix it without players having to move files around?
Use rpath's when you build the game, then ship the needed libraries.

Alternatively, you can use a script to launch the game, and set the LD path from that script. Rpaths are a tighter solution though.

Also note, your current solution is not acceptable on many other distros. Plus it will probably be overwritten on an update, and/or possibly break other games.
Unfortunately, none of that makes any sense to me, so I need help.
 
Last edited:

Yal

🐧 *penguin noises*
GMC Elder
rpath is the path to search for .so files (which are dynamic runtime-linked libraries, basically the Linux counterpart to DLL files). This StackOverflow question has some info about it. So does this, which talks about the difference of rpath and the -L compiler flag.

So what that user suggested is as follows:
Either:
  1. Compile the game with a flag that sets the path it'll look for SO files to a non-standard value, so it'll find the up-to-date library instead of steam's versions.

Or:
  1. Have the thing started when the user runs the game actually be a short shell script, instead of the main executable.
  2. Include the necessary files in the game upload.
  3. That shell script overrides the path to check for runtime libraries (aka SO files) to point to the folder with the necessary libraries shipped with your game. (Environment variables are per-process, so this won't mess with any user configuration).
  4. Then, the shell script starts the game, passing on the altered environment so that the game will load the SO files it shipped with instead of the system's defaults.

The second version seems like the better to me, since you can guarantee you have a working setup if you ship the files you need, but it's more work and requires you to know a bit of Bash.
 

Phoebe Klim

Member
I would like to be guaranteed that the game works, that would be nice, hah.
I wouldn't mind putting some effort into making it work either, but I don't know where to begin, I don't have any experience with Bash.

I need to 1) Learn how to make script 2) Learn what to put in a script to make it find the libraries 3) Figure out what libraries are needed, so I could add them to Included Files in my GM project.
Is there a tutorial/guide on how to do any of this?
I couldn't find anything.
 

Yal

🐧 *penguin noises*
GMC Elder
For #1, I think the guide at the Linux Documentation Project is the recommended source to learn bash thoroughly: http://www.tldp.org/LDP/Bash-Beginners-Guide/html/

However, it's probably easier to type in "how do I do <thing you want to do> in bash site:stackoverflow.com" in your favorite search engine and then just refine the search until you find something you can just copypaste and tweak. I'm an engineer that's been doing commercial Linux development for >3 years and it's still my goto approach to an unfamiliar problem.


For #3, the snippet you posted mentions libcurl.so.4. If you can run the game on your Linux machine / VM you use to create the executable, you could find it by running this command in a terminal:
find / 2>/dev/null | grep libcurl.so.4

(which means "find every file in the top of the filesystem and below, ignore error messages, and do a regexp search for "libcurl.so.4" in the output of the previous command")
(You will get a bunch of error messages running "find /" because of file permissions, and they'll make it hard to parse the output, that's why we need to ignore them.)


I'm imagining the script should just be some variant of this:
Code:
#!/bin/bash
THAT_LINK_PATH_THING=./game_assets/the_libraries_from_step_3
./game_assets/game.elf
All you need to do is to set an environment variable and then invoke the main game, so it's going to be pretty simple. (At least if you don't do any fancy stuff like checking if the files exist first, which you probably might wanna do for a commercial product...). So see this more as pseudocode.
 

Phoebe Klim

Member
However, it's probably easier to type in "how do I do <thing you want to do> in bash site:stackoverflow.com" in your favorite search engine and then just refine the search until you find something you can just copypaste and tweak. I'm an engineer that's been doing commercial Linux development for >3 years and it's still my goto approach to an unfamiliar problem.
Hah, the problem is that I don't know how <the thing I want to do> is called.

For #1, I think the guide at the Linux Documentation Project is the recommended source to learn bash thoroughly: http://www.tldp.org/LDP/Bash-Beginners-Guide/html/
Lots of words I don't understand, but I've learned a few things.

I decided to start with a script that simply runs the game. And I had some success, it does do that.
After giving it permission. From terminal. If it's opened in the folder the script is located at.



So I guess <the thing I want to do> is to create a file that does that automatically and can be put in Steamworks launch options, so Steam can run it, and so run the game.

 

Yal

🐧 *penguin noises*
GMC Elder
Sweet, that's a pretty good start!

So I guess what's missing is
  1. Find the libraries
  2. Find the path variable to override
I already gave you a code snippet to search for the libraries, the idea is to list files recursively (over your entire linux machine) in some way, then use a search function to filter out the ones matching the name - find and grep are my main gotos for this. (in my line of work, embedded linux, nothing is properly documented, so searching for things you only have a very vague idea about is easily 50% of the workload, so my goto strategy to solve any problem starts with "search for things that seem relevant").


So... finding the path variable to override. A good first step might be this:
  1. Open a terminal.
  2. Type "echo $" but don't execute the command.
  3. Hit "tab" twice. If you get a warning like "over 100 results, proceed?", hit enter (or type Y) to confirm.
  4. Your window will now get filled with every known symbol starting with an $ - i.e., all currently known environment variables. (Their names, to be precise, since you triggered an autocomplete "list all matching suggestions" by tabbing twice in the middle of a half-finished token)
  5. Hit Ctrl-C to abort the half-finished command.
  6. Copypaste all the environment variable output to a text file (select it all, right-click, "copy", open a text editor... I think the default one in Ubuntu is called gedit... and then right-click-->paste. You can use ctrl+insert and shift+insert to copy and paste portably, but you've had enough new stuff to learn for one day :p)
  7. In the text editor, search for PATH.
  8. See if any of the hits is the variable you heard about originally ($LDPATH or $RPATH or whatever it was called)
  9. If so, you know which one to override!
 

chamaeleon

Member
  1. Type "echo $" but don't execute the command.
  2. Hit "tab" twice. If you get a warning like "over 100 results, proceed?", hit enter (or type Y) to confirm.
  3. Your window will now get filled with every known symbol starting with an $ - i.e., all currently known environment variables. (Their names, to be precise, since you triggered an autocomplete "list all matching suggestions" by tabbing twice in the middle of a half-finished token)
  4. Hit Ctrl-C to abort the half-finished command.
  5. Copypaste all the environment variable output to a text file (select it all, right-click, "copy", open a text editor... I think the default one in Ubuntu is called gedit... and then right-click-->paste. You can use ctrl+insert and shift+insert to copy and paste portably, but you've had enough new stuff to learn for one day :p)
  6. In the text editor, search for PATH.
Or, you know.. Just
Code:
$ env > env.txt
or
Code:
echo $PATH
or ...
Code:
echo $PATH | tr : '\n' | grep <whatever>
 

Yal

🐧 *penguin noises*
GMC Elder
Or, you know.. Just
Code:
$ env > env.txt
or
Code:
echo $PATH
or ...
Code:
echo $PATH | tr : '\n' | grep <whatever>
We're not looking for something in $PATH here, we're looking for one of several possible variables whose name contains "PATH". (The env approach in the first suggestion probably is easier than using autocomplete to list the env vars, though... except all the variable contents might make it harder to filter out the interesting bit since we only want the variable name in the first step, to find which one of them is available)
 

chamaeleon

Member
We're not looking for something in $PATH here, we're looking for one of several possible variables whose name contains "PATH". (The env approach in the first suggestion probably is easier than using autocomplete to list the env vars, though... except all the variable contents might make it harder to filter out the interesting bit since we only want the variable name in the first step, to find which one of them is available)
Oops! My mistake. In that case, of course (given PATH being part of the name)
Code:
$ env | grep PATH
Anyway, I just reacted to the slightly convoluted way of getting the environment variables into a text file, primarily. :)

Finding out which environment variable is relevant, is another matter of course.. All the commands tend to be easier to work with when you know what you're looking for.
 

Yal

🐧 *penguin noises*
GMC Elder
I suppose my reasoning when it comes to learning how something works is "once you find one way that works, there's no reason to find a better way" :p I'm good at finishing things, but I'm definitely not efficient by any means...
 

Phoebe Klim

Member


I checked, the newest libcurl is 7.67.0



So if I understand this correctly, I'm looking for a variable that stores the location of libraries, e.g.: libcurl. Once I know which one is it, I can change the variable to point to a different folder/directory/whatever it's called, which would have the newer libcurl.

Did I found it?
 

Yal

🐧 *penguin noises*
GMC Elder
Seems like the path variable isn't set, judging from your results...

I did some more research and found this SO answer: https://stackoverflow.com/questions...vironmental-variable-ld-library-path-in-linux
The variable appears to be called LD_LIBRARY_PATH, so if you set that in the script, it should be used. You probably want to set it like this:
Code:
export LD_LIBRARY_PATH=./datafiles/libraries:$LD_LIBRARY_PATH
i.e., if it's already set on user's system, you will place your alternate path first in the list, but you keep the old values as well (so it will look there for additional libraries if any more are needed).

Note that ./datafiles/libraries here is just my example path you'd store the libraries you ship with the game in. Use the actual path they'll end up in in the final script :p
 

Phoebe Klim

Member
That's where I am at right now:



Running run.sh gives a different error than just running SectorSix executable.

These errors are my only clues, I'll try to see if there's anything about them in StackOverflow tomorrow.
 

chamaeleon

Member
That's where I am at right now:



Running run.sh gives a different error than just running SectorSix executable.

These errors are my only clues, I'll try to see if there's anything about them in StackOverflow tomorrow.
It is a bit hard for me to see what your paths are, but "./" in the beginning of a path (or not including it at all..) means relative the directory you are in when you run the script, not relative where your shell script is stored for instance. Typically, you use full absolute paths starting from root when specifying directories in path environment variables to avoid this problem. Similarly, ./SectorSix should have a fully qualified path as well (or be in a directory that is in PATH, exception being if the script changes the current directory so that a relative path makes sense at execution time).

Edit: I have no idea if Steam does something convenient for you in this respect, if Steam invokes your shell script.
 

Phoebe Klim

Member
So like this?



Edit: I have no idea if Steam does something convenient for you in this respect, if Steam invokes your shell script.
Yeah, you are right ./SectorSix just asks Steam to execute run.sh
I keep forgetting that.
I guess the useful part is that just clicking "Play" on Steam shows no errors at all.

Anyway, few minutes after doing that, I tried doing a few trial and error things.

I changed the path to:
export LD_LIBRARY_PATH=./assets/linux/libraries/usr/lib/x86_64-linux-gnu/

It's exactly where libcurl.so files are.

It didn't work, it printed an error, something about libsteam_api.so
Another big brain moment and I moved the libsteam_api.so to ./assets/linux/libraries/usr/lib/x86_64-linux-gnu/

And there's some progress! The game "launched" - a blank white "Sector Six" window popped up and I've got a Steam card for the game, hah.



The game is still not playable.

The newest version of run.sh:

#!/bin/bash
pwd
cd "$(dirname "$0")"
pwd
export LD_LIBRARY_PATH=./assets/linux/libraries/usr/lib/x86_64-linux-gnu/
./SectorSix

And the errors it makes:

 

Yal

🐧 *penguin noises*
GMC Elder
It didn't work, it printed an error, something about libsteam_api.so
Another big brain moment and I moved the libsteam_api.so to ./assets/linux/libraries/usr/lib/x86_64-linux-gnu/
A better option would be do add the path to that file to the path variable too (you can have multiple paths separated by colons) since you don't want to move around the user's DLL SO files in the real use case - having multiple paths in the path variable makes the linker look for them sequentially.

I think you get a segmentation fault because if you move the "libsteam_api.so" file, you probably moved a symlink (since it has no version number) - symlinks are used so apps can just link to the SO file without checking for version numbers, and they're usually linked to a file in the same folder... which isn't there if you only moved the link.


Nvm, I misread it and throught you moved the library from /usr/lib instead of the game's assets... derp.

I still think you should add the normal path to the end of the path variable, though...

export LD_LIBRARY_PATH="./assets/linux/libraries/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH:/usr/lib"

(The steam library might rely on other libraries which you don't include, so you need to look for them in the normal path as well)
(Also, always use double-quotes around stuff containing $variables for stability/security reasons)
 

Phoebe Klim

Member
The struggle continues after a short break!

export LD_LIBRARY_PATH="./assets/linux/libraries/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH:/usr/lib"
I've changed it to that, but I think it gives the same error as before.



Now what?
 

Yal

🐧 *penguin noises*
GMC Elder
Re-running it with a tracing command that lists all file accesses it does would be my next step. A guy made a tool that uses strace (which prints all system calls your program does, i.e. enough walls of text that you could build a small settlement with them) and just outputs file accesses, in the accepted answer of this SO question: https://unix.stackexchange.com/questions/18844/list-the-files-accessed-by-a-program

Basically, verify that it accesses files in the right place. If it accesses files that aren't there, they might need to be copied / symlinked / added to the path variable. If the files are there... I'm not really sure how to proceed. If it accesses files on the wrong path (e.g. standard path instead of local) there's either something weird going on with what Steam is doing, the override is re-overridden, or maybe the override is incorrect. (It might be other stuff being wrong, of course, those are just my educated guesses)
 

Phoebe Klim

Member
I have:

- Installed strace
- Downloaded tracefile
- Installed parallel which was required for test.sh script which comes with tracefile

Then I got stuck - I don't know how to use tracefile, so I decided to at least try using strace, and finally - results:



Code:
execve("./run.sh", ["./run.sh"], 0x7ffcbcd8d5c0 /* 57 vars */) = 0
brk(NULL)                               = 0x55d24e20c000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=95919, ...}) = 0
mmap(NULL, 95919, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7feaef3cd000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\311\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=170784, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feaef3cb000
mmap(NULL, 2267936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feaeef94000
mprotect(0x7feaeefb9000, 2097152, PROT_NONE) = 0
mmap(0x7feaef1b9000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7feaef1b9000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14560, ...}) = 0
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feaeed90000
mprotect(0x7feaeed93000, 2093056, PROT_NONE) = 0
mmap(0x7feaeef92000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7feaeef92000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feaee99f000
mprotect(0x7feaeeb86000, 2097152, PROT_NONE) = 0
mmap(0x7feaeed86000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7feaeed86000
mmap(0x7feaeed8c000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7feaeed8c000
close(3)                                = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feaef3c8000
arch_prctl(ARCH_SET_FS, 0x7feaef3c8740) = 0
mprotect(0x7feaeed86000, 16384, PROT_READ) = 0
mprotect(0x7feaeef92000, 4096, PROT_READ) = 0
mprotect(0x7feaef1b9000, 16384, PROT_READ) = 0
mprotect(0x55d24d13d000, 16384, PROT_READ) = 0
mprotect(0x7feaef3e5000, 4096, PROT_READ) = 0
munmap(0x7feaef3cd000, 95919)           = 0
openat(AT_FDCWD, "/dev/tty", O_RDWR|O_NONBLOCK) = 3
close(3)                                = 0
brk(NULL)                               = 0x55d24e20c000
brk(0x55d24e22d000)                     = 0x55d24e22d000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=12005968, ...}) = 0
mmap(NULL, 12005968, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7feaede2b000
close(3)                                = 0
getuid()                                = 1000
getgid()                                = 1000
geteuid()                               = 1000
getegid()                               = 1000
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
ioctl(-1, TIOCGPGRP, 0x7ffc3bef3ff4)    = -1 EBADF (Bad file descriptor)
sysinfo({uptime=1754, loads=[1344, 2720, 1024], totalram=1030729728, freeram=68325376, sharedram=57126912, bufferram=11726848, totalswap=495411200, freeswap=442183680, procs=357, totalhigh=0, freehigh=0, mem_unit=1}) = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7feaee9ddf20}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
uname({sysname="Linux", nodename="zuurix-VirtualBox", ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
getpid()                                = 2307
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26376, ...}) = 0
mmap(NULL, 26376, PROT_READ, MAP_SHARED, 3, 0) = 0x7feaef3de000
close(3)                                = 0
getppid()                               = 2305
getpid()                                = 2307
getpgrp()                               = 2305
ioctl(2, TIOCGPGRP, [2305])             = 0
rt_sigaction(SIGCHLD, {sa_handler=0x55d24ce91790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7feaee9ddf20}, 8) = 0
prlimit64(0, RLIMIT_NPROC, NULL, {rlim_cur=3743, rlim_max=3743}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
openat(AT_FDCWD, "./run.sh", O_RDONLY)  = 3
stat("./run.sh", {st_mode=S_IFREG|0775, st_size=154, ...}) = 0
ioctl(3, TCGETS, 0x7ffc3bef3f80)        = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR)                   = 0
read(3, "#!/bin/bash\npwd\ncd \"$(dirname \"$"..., 80) = 80
lseek(3, 0, SEEK_SET)                   = 0
prlimit64(0, RLIMIT_NOFILE, NULL, {rlim_cur=1024, rlim_max=1024*1024}) = 0
fcntl(255, F_GETFD)                     = -1 EBADF (Bad file descriptor)
dup2(3, 255)                            = 255
close(3)                                = 0
fcntl(255, F_SETFD, FD_CLOEXEC)         = 0
fcntl(255, F_GETFL)                     = 0x8000 (flags O_RDONLY|O_LARGEFILE)
fstat(255, {st_mode=S_IFREG|0775, st_size=154, ...}) = 0
lseek(255, 0, SEEK_CUR)                 = 0
read(255, "#!/bin/bash\npwd\ncd \"$(dirname \"$"..., 154) = 154
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
write(1, "/home/zuurix/.steam/steam/steama"..., 54) = 54
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
pipe([3, 4])                            = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
lseek(255, -117, SEEK_CUR)              = 37
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7feaef3c8a10) = 2308
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigaction(SIGCHLD, {sa_handler=0x55d24ce91790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7feaee9ddf20}, {sa_handler=0x55d24ce91790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7feaee9ddf20}, 8) = 0
close(4)                                = 0
read(3, ".\n", 128)                     = 2
read(3, "", 128)                        = 0
close(3)                                = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x55d24ce8e160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2308
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=0x55d24ce8e160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2308, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffc3bef3210, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]})                 = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
chdir("/home/zuurix/.steam/steam/steamapps/common/Sector Six") = 0
read(255, "pwd\nexport LD_LIBRARY_PATH=\"./as"..., 154) = 117
write(1, "/home/zuurix/.steam/steam/steama"..., 54) = 54
read(255, "", 154)                      = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [INT CHLD], 8) = 0
rt_sigprocmask(SIG_SETMASK, [INT CHLD], NULL, 8) = 0
lseek(255, 117, SEEK_CUR)               = 271
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7feaef3c8a10) = 2309
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x55d24ce8e160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], 0, NULL) = 2309
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, {sa_handler=0x55d24ce8e160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7feaee9ddf20}, 8) = 0
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2995
read(3, "", 4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "./run.sh: line 6:  2309 Segmenta"..., 74) = 74
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_DUMPED, si_pid=2309, si_uid=1000, si_status=SIGSEGV, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffc3bef3790, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]})                 = 0
read(255, "", 154)                      = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(139)                         = ?
+++ exited with 139 +++

I can see a few "-1 ENOENT (No such file or directory)" so I guess I'm on the right track.
 

Yal

🐧 *penguin noises*
GMC Elder
Reading through the full log, it tries to access some bash.mo / libc.mo files in /usr/share and fails... since those files look like locale files, it might be failing to print an error message because of the earlier accesses to /etc/ld.so.nohwcap failing, I'm not sure. (That's the drawback with strace, it's very verbose as soon as you try to debug a real program). Could be worth verifying that all of those files both exist and are accessible from the path you set, though. (As in, the paths /etc and /usr/share being accessible - hardcoding the full path of every file sounds excessive)
 

Phoebe Klim

Member
I've checked: ld.so.nohwcap, ld.so.preload, bash.mo, libc.mo - it seems like they don't exist in my VM.
Great, this keeps getting more complicated.

Googling/searching in Stack Overflow leads me nowhere, where am I supposed to get these files from?
 

chamaeleon

Member
I've checked: ld.so.nohwcap, ld.so.preload, bash.mo, libc.mo - it seems like they don't exist in my VM.
Great, this keeps getting more complicated.

Googling/searching in Stack Overflow leads me nowhere, where am I supposed to get these files from?
Just because they can't be found doesn't mean necessarily mean they are required. A program (directly, or indirectly through systems libraries) may attempt to load shared libraries by code (i.e., not directly linked to your executable), and if it fails fall back on some default built-in behavior. I'd suspect these files have nothing to do with it.
 

devKathy

Member
Alright, I thought this would be a good learning experience, so I decided to do some googling on this. I've found several points that may be useful. I'll edit this post again if I can get the game running on an Xubuntu VM, which I may try to do just to see if I'm right. At the rate you guys are going, you'll likely beat me to it, though. Working on some Python & GM today.

Take everything I say with a grain of salt, as I likely have less experience with bash than these other two repliers, although it's not zero experience either. So, if I say something incorrect, you two, don't destroy me. Although, light verbal abuse would be okay. :p

This isn't Stack Overflow, so I feel a bit more comfortable putting what I've found here:

1. The presence of ld.so.nohwcap tells the linker to load the non-optimized version of a library. My hypothesis is that Steam didn't want to load the most recent version of some library, perhaps curl.

https://unix.stackexchange.com/a/353311

2. ld.so.preload is a file that, according to its manual page, "contains a whitespace-separated list of ELF shared objects to be loaded before the program." ( Where ELF means "Executable and Linking Format"). It usually doesn't exist, so it just gets looked for once and then we don't bother again. This seems consistent with your strace.

So since it doesn't need it, I think @chamaeleon is right in this case.

https://unix.stackexchange.com/a/282139
https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/

3. Below, a very sarcastic blogger (circa '05) details a scenario where his Linux box is moving like a sloth because it's endlessly searching for some optimized libraries. All he does is run a touch command for ld.so.nohwcap and things speed right up.

https://saintaardvarkthecarpeted.com/blog/2005/08/14/_etc_ld.so.nohwcap/

Putting #1 & #3 together with what @Yal said, perhaps the accesses to ld.so.nohwcap basically constitute Steam's attempt to stop itself from crawling around your files to search for the best version of all the various libraries. It then has further issues when, as she said, it tries to use your locale's shared objects to give you errors.

Conclusion:

If you do "touch ld.so.nohwcap" in your etc directory like the guy from #3 did, you might skip all those faulty accesses. This wouldn't guarantee that there isn't something else wrong, though.
If you need to generate locale files, maybe for more verbose error messages that could help you out, if nothing else, you may be able to use locale-gen... http://manpages.ubuntu.com/manpages/xenial/man8/locale-gen.8.html

Hope that helps. Was good for my brain to do this. :D
 

Phoebe Klim

Member
Thanks!

I have added ld.so.nohwcap just to see what happens and I've used locale-gen.

Basically, nothing changed:

Code:
execve("./run.sh", ["./run.sh"], 0x7ffc1c082fe0 /* 48 vars */) = 0
brk(NULL)                               = 0x562181a29000
access("/etc/ld.so.nohwcap", F_OK)      = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=95919, ...}) = 0
mmap(NULL, 95919, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f64169ea000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\311\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=170784, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f64169e8000
mmap(NULL, 2267936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f64165b1000
mprotect(0x7f64165d6000, 2097152, PROT_NONE) = 0
mmap(0x7f64167d6000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7f64167d6000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14560, ...}) = 0
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f64163ad000
mprotect(0x7f64163b0000, 2093056, PROT_NONE) = 0
mmap(0x7f64165af000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f64165af000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f6415fbc000
mprotect(0x7f64161a3000, 2097152, PROT_NONE) = 0
mmap(0x7f64163a3000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f64163a3000
mmap(0x7f64163a9000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f64163a9000
close(3)                                = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f64169e5000
arch_prctl(ARCH_SET_FS, 0x7f64169e5740) = 0
mprotect(0x7f64163a3000, 16384, PROT_READ) = 0
mprotect(0x7f64165af000, 4096, PROT_READ) = 0
mprotect(0x7f64167d6000, 16384, PROT_READ) = 0
mprotect(0x562181795000, 16384, PROT_READ) = 0
mprotect(0x7f6416a02000, 4096, PROT_READ) = 0
munmap(0x7f64169ea000, 95919)           = 0
openat(AT_FDCWD, "/dev/tty", O_RDWR|O_NONBLOCK) = 3
close(3)                                = 0
brk(NULL)                               = 0x562181a29000
brk(0x562181a4a000)                     = 0x562181a4a000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4253264, ...}) = 0
mmap(NULL, 4253264, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6415bad000
close(3)                                = 0
getuid()                                = 1000
getgid()                                = 1000
geteuid()                               = 1000
getegid()                               = 1000
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
ioctl(-1, TIOCGPGRP, 0x7ffeae47cb34)    = -1 EBADF (Bad file descriptor)
sysinfo({uptime=2682, loads=[5856, 1824, 448], totalram=1030729728, freeram=281014272, sharedram=96546816, bufferram=15683584, totalswap=495411200, freeswap=111005696, procs=358, totalhigh=0, freehigh=0, mem_unit=1}) = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6415ffaf20}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
uname({sysname="Linux", nodename="zuurix-VirtualBox", ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
getpid()                                = 2518
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26376, ...}) = 0
mmap(NULL, 26376, PROT_READ, MAP_SHARED, 3, 0) = 0x7f64169fb000
close(3)                                = 0
getppid()                               = 2516
getpid()                                = 2518
getpgrp()                               = 2516
ioctl(2, TIOCGPGRP, [2516])             = 0
rt_sigaction(SIGCHLD, {sa_handler=0x5621814e9790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6415ffaf20}, 8) = 0
prlimit64(0, RLIMIT_NPROC, NULL, {rlim_cur=3743, rlim_max=3743}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
openat(AT_FDCWD, "./run.sh", O_RDONLY)  = 3
stat("./run.sh", {st_mode=S_IFREG|0775, st_size=154, ...}) = 0
ioctl(3, TCGETS, 0x7ffeae47cac0)        = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR)                   = 0
read(3, "#!/bin/bash\npwd\ncd \"$(dirname \"$"..., 80) = 80
lseek(3, 0, SEEK_SET)                   = 0
prlimit64(0, RLIMIT_NOFILE, NULL, {rlim_cur=1024, rlim_max=1024*1024}) = 0
fcntl(255, F_GETFD)                     = -1 EBADF (Bad file descriptor)
dup2(3, 255)                            = 255
close(3)                                = 0
fcntl(255, F_SETFD, FD_CLOEXEC)         = 0
fcntl(255, F_GETFL)                     = 0x8000 (flags O_RDONLY|O_LARGEFILE)
fstat(255, {st_mode=S_IFREG|0775, st_size=154, ...}) = 0
lseek(255, 0, SEEK_CUR)                 = 0
read(255, "#!/bin/bash\npwd\ncd \"$(dirname \"$"..., 154) = 154
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
write(1, "/home/zuurix/.steam/steam/steama"..., 54) = 54
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
pipe([3, 4])                            = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
lseek(255, -117, SEEK_CUR)              = 37
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f64169e5a10) = 2519
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigaction(SIGCHLD, {sa_handler=0x5621814e9790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6415ffaf20}, {sa_handler=0x5621814e9790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6415ffaf20}, 8) = 0
close(4)                                = 0
read(3, ".\n", 128)                     = 2
read(3, "", 128)                        = 0
close(3)                                = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x5621814e6160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2519
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=0x5621814e6160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2519, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffeae47bd50, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]})                 = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
chdir("/home/zuurix/.steam/steam/steamapps/common/Sector Six") = 0
read(255, "pwd\nexport LD_LIBRARY_PATH=\"./as"..., 154) = 117
write(1, "/home/zuurix/.steam/steam/steama"..., 54) = 54
read(255, "", 154)                      = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [INT CHLD], 8) = 0
rt_sigprocmask(SIG_SETMASK, [INT CHLD], NULL, 8) = 0
lseek(255, 117, SEEK_CUR)               = 271
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f64169e5a10) = 2520
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x5621814e6160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], 0, NULL) = 2520
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, {sa_handler=0x5621814e6160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f6415ffaf20}, 8) = 0
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2995
read(3, "", 4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "./run.sh: line 6:  2520 Segmenta"..., 74) = 74
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_DUMPED, si_pid=2520, si_uid=1000, si_status=SIGSEGV, si_utime=1, si_stime=2} ---
wait4(-1, 0x7ffeae47c2d0, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]})                 = 0
read(255, "", 154)                      = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(139)                         = ?
+++ exited with 139 +++

Locale files are still missing, and the game still doesn't run.
 

devKathy

Member

The above is a video that will show you my VM launching the game as well as some context.

Missing from the video - or perhaps just not explicitly stated, is that the "required libraries" are libcurl and libsteam.

If you do not have these I can send them.

If you run into further issues, it may be possible to send you the VM itself.
 

Phoebe Klim

Member
The video makes sense to me, the only difference is that the game is not playable* for me.

*Side note: It seems to have that weird YYC texture bug. Need to upload new re-compiled build sometime.

I have made sure that the libsteam_api.so, libcurl.so.4.5.0, and libcurl.so.4 are in usr/lib/x86_64_linux_gnu/

They weren't before, but the idea supposedly was to include them with the game so it wouldn't matter if I had them or not.
But I just want to run the game at this point.

I have deleted ld.nohwcap.

I have changed my run.sh script to not set the LD_LIBRARY_PATH
Code:
#!/bin/bash
pwd
cd "$(dirname "$0")"
pwd
./SectorSix
The game window opens - at first it's transparent, then it turns white, and I don't close it fast enough it freezes my VM (forever?) and I have to shut it down.
This is the same as it was since post #15.

Strace is also the same.

execve("./run.sh", ["./run.sh"], 0x7ffea1b3de60 /* 48 vars */) = 0
brk(NULL) = 0x5636e364a000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=95919, ...}) = 0
mmap(NULL, 95919, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f89afc77000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\311\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=170784, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f89afc75000
mmap(NULL, 2267936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f89af83e000
mprotect(0x7f89af863000, 2097152, PROT_NONE) = 0
mmap(0x7f89afa63000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7f89afa63000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14560, ...}) = 0
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f89af63a000
mprotect(0x7f89af63d000, 2093056, PROT_NONE) = 0
mmap(0x7f89af83c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f89af83c000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f89af249000
mprotect(0x7f89af430000, 2097152, PROT_NONE) = 0
mmap(0x7f89af630000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f89af630000
mmap(0x7f89af636000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f89af636000
close(3) = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f89afc72000
arch_prctl(ARCH_SET_FS, 0x7f89afc72740) = 0
mprotect(0x7f89af630000, 16384, PROT_READ) = 0
mprotect(0x7f89af83c000, 4096, PROT_READ) = 0
mprotect(0x7f89afa63000, 16384, PROT_READ) = 0
mprotect(0x5636e2ed0000, 16384, PROT_READ) = 0
mprotect(0x7f89afc8f000, 4096, PROT_READ) = 0
munmap(0x7f89afc77000, 95919) = 0
openat(AT_FDCWD, "/dev/tty", O_RDWR|O_NONBLOCK) = 3
close(3) = 0
brk(NULL) = 0x5636e364a000
brk(0x5636e366b000) = 0x5636e366b000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4253264, ...}) = 0
mmap(NULL, 4253264, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f89aee3a000
close(3) = 0
getuid() = 1000
getgid() = 1000
geteuid() = 1000
getegid() = 1000
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
ioctl(-1, TIOCGPGRP, 0x7ffe6a2ab6c4) = -1 EBADF (Bad file descriptor)
sysinfo({uptime=1285, loads=[43872, 25056, 14304], totalram=1030729728, freeram=435347456, sharedram=15249408, bufferram=9326592, totalswap=495411200, freeswap=692224, procs=364, totalhigh=0, freehigh=0, mem_unit=1}) = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f89af287f20}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
uname({sysname="Linux", nodename="zuurix-VirtualBox", ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
getpid() = 3042
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26376, ...}) = 0
mmap(NULL, 26376, PROT_READ, MAP_SHARED, 3, 0) = 0x7f89afc88000
close(3) = 0
getppid() = 3040
getpid() = 3042
getpgrp() = 3040
ioctl(2, TIOCGPGRP, [3040]) = 0
rt_sigaction(SIGCHLD, {sa_handler=0x5636e2c24790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f89af287f20}, 8) = 0
prlimit64(0, RLIMIT_NPROC, NULL, {rlim_cur=3743, rlim_max=3743}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
openat(AT_FDCWD, "./run.sh", O_RDONLY) = 3
stat("./run.sh", {st_mode=S_IFREG|0775, st_size=52, ...}) = 0
ioctl(3, TCGETS, 0x7ffe6a2ab650) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
read(3, "#!/bin/bash\npwd\ncd \"$(dirname \"$"..., 80) = 52
lseek(3, 0, SEEK_SET) = 0
prlimit64(0, RLIMIT_NOFILE, NULL, {rlim_cur=1024, rlim_max=1024*1024}) = 0
fcntl(255, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 255) = 255
close(3) = 0
fcntl(255, F_SETFD, FD_CLOEXEC) = 0
fcntl(255, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE)
fstat(255, {st_mode=S_IFREG|0775, st_size=52, ...}) = 0
lseek(255, 0, SEEK_CUR) = 0
read(255, "#!/bin/bash\npwd\ncd \"$(dirname \"$"..., 52) = 52
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
write(1, "/home/zuurix/.steam/steam/steama"..., 54) = 54
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
pipe([3, 4]) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
lseek(255, -15, SEEK_CUR) = 37
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f89afc72a10) = 3043
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigaction(SIGCHLD, {sa_handler=0x5636e2c24790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f89af287f20}, {sa_handler=0x5636e2c24790, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f89af287f20}, 8) = 0
close(4) = 0
read(3, ".\n", 128) = 2
read(3, "", 128) = 0
close(3) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x5636e2c21160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 3043
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=0x5636e2c21160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3043, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffe6a2aa8d0, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/zuurix/.steam/steam/steamapps/common/Sector Six", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
chdir("/home/zuurix/.steam/steam/steamapps/common/Sector Six") = 0
read(255, "pwd\n./SectorSix", 52) = 15
write(1, "/home/zuurix/.steam/steam/steama"..., 54) = 54
read(255, "", 52) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [INT CHLD], 8) = 0
rt_sigprocmask(SIG_SETMASK, [INT CHLD], NULL, 8) = 0
lseek(255, 15, SEEK_CUR) = 67
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f89afc72a10) = 3044
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x5636e2c21160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], 0, NULL) = 3044
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=0x5636e2c21160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2995
read(3, "", 4096) = 0
close(3) = 0
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "./run.sh: line 5: 3044 Segmenta"..., 74) = 74
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_DUMPED, si_pid=3044, si_uid=1000, si_status=SIGSEGV, si_utime=0, si_stime=1} ---
wait4(-1, 0x7ffe6a2aae50, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
read(255, "", 52) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(139) = ?
+++ exited with 139 +++
 

Yal

🐧 *penguin noises*
GMC Elder
Cursory googling reveals that exit status 139 is flag 128 (abnormal exit) + errno code for segmentation fault. But since the trace reveals it tries to print a localized error message for it, I'm still not sure that's what kills it in the end. Removing the pwds might help make the log a bit less bloated, since they're essentially NOPs once you know it finds the correct directory.

I think this line is when it starts trying to execute the program:
Code:
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f89afc72a10) = 3044
(since processes can only start new processes by cloning themselves, or something along those lines - this is needed to make sure child processes can't get HIGHER privileges than their parents, iirc)

I also think this line is where things go wrong:
Code:
rt_sigaction(SIGINT, {sa_handler=0x5636e2c21160, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f89af287f20}, 8) = 0
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], 0, NULL) = 3044
wait4 returns a nonzero exit code, which typically means something unusual happened. (As you can see, most system calls return 0, except read and write... which probably return the number of bytes they read/wrote rather than error-codes and flags. You should be able to check that using the man syscallnamegoeshere command)
We also see a SIGSEGV in there (and nowhere prior) which might indicate whatever it did is what caused the segmentation fault. The lines thereafter seem to locate the locale stuff and try to print an error message.
 

Phoebe Klim

Member
Spent several hours today and yesterday trying various things.

I tried to fix the missing bash.mo problem: There are like /two/ articles with locale commands and I've tried a few of them - none have installed bash.mo and that other one in the directories it was supposed to be in.
I tried to find a place from which I could download these files, but no luck either.
I tried to fix it by destroying VM and creating a new one - the idea is that I did something wrong while installing/messing with locale commands. It did not help.

But I got an idea from devKathy's video: Instead of running run.sh that has ./SectorSix, just run ./SectorSix directly.
It created output without locale errors:

https://paste.ofcode.org/LHmes4a8VBX8p9DsdpHn7e

As I was writing this post, I've got another idea of how to use strace.

Idea 1:

strace -o strace.txt ./run.sh

run.sh:

./SectorSix

LOCALE ERRORS

Idea 2:

strace -o strace.txt ./SectorSix

NO LOCALE ERRORS

Idea 3:

./run.sh

run.sh:

strace -o strace.txt ./SectorSix

NO LOCALE ERRORS

* * *

Pretty sure all three produce significantly different outputs.
I am starting to understand the true meaning of "strace is very verbose".

This is idea 3 output:

https://paste.ofcode.org/yEWdtACyDzBqnjg3XDGn9m

Anything useful in there? I've just skimmed through it. I will resume work on this tomorrow.

EDIT: So now it's not finding a whole bunch of libraries...
 
Last edited:

Phoebe Klim

Member


It works for me!

I had to add steam_appid.txt and set LD_LIBRARY_PATH to find libsteam_api.so, but besides that, all of those weird errors seem to be caused by me not having correct libraries mentioned in the official guide.

Currently can't make a build in Ubuntu with YYC, will try to fix that as well later.
 

Phoebe Klim

Member
WARNING: Unable to connect to remote client: ssh command 'cd /home/zuurix/GameMakerStudio2/yyc/SectorSix && make -j `nproc --all`' failed.
/usr/bin/ld: cannot find -lcurl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [SectorSix] Error 1
I am getting this error when attempting to create a build with YYC.
I tried a few searches and a few things yesterday but I have not fixed the problem.
 

Phoebe Klim

Member
Alright, so installing libcurl4 allowed me to create an executable with YYC, but I still needed to include libcurl.so.4 with the game assets to make it work properly on Steam - it wouldn't launch from Steam library without it.
It's been a few days and looks like the game is working at least for some of the players, so the problem seems to be solved.

Many thanks to @Yal, @chamaeleon, and @devKathy!
 

Japster

Member
Hi @Zuurix ! - Hoping you may be able to kindly help with my last-ditch attempt to get my Steam game released / distributed on Linux, as I'm having the same issue as above, I think? - The YoYo runner / RUN YYC seems to work just fine when I test vby running it, but the Steam 'create executable' uploaded (then downloaded via Steam) version of my game doesn't seem to start (it does start, but straight away it exits (doesn't even show a screen / display) - EXECing it in Terminal shows it at least starts, but exits...

Soooo.... ....My question is.... :) ....You mention you had to add libcurl.so.4 into your assets? - Did you mean you included it as a linux-only file, in your project please? - or did you also need to drop it somewhere via a script, on the user's system, to get your game to launch? - I'm literally about to give up after a wasted week! :(

Oh, just out of interest, did you actually find it worth it to make your game available to Linux users, if you don't mind my asking? - not asking for numbers of course, but just, was the market / were sales satisfactory / worth the effort? - I'm just wondering if I'm going crazy here, for a potentially lost cause?- I'd rather know if there simply doesn't seem to be a decent market for a Linux version, given the effort and stress this seems to be!

Best regards, and any help / advice as regards what worked for you, would be most appreciated! - Which reminds me, even though I selected both Windows and Linux depots, Steam seemed to always (apart from a one-off build upload), try (and fail of course) to run my Windows-specific executable ".exe", even though I specified Linux launch option, depot, associated them, etc...

PS - @chamaeleon - I never thought to ask you too yet mate, but have you also successfully released a Linux YYC compiled Steam game please?

Cheers guys!
 

Phoebe Klim

Member
Here is my setup:

Main.png

Assets.png
run.sh:

#!/bin/bash

export LD_LIBRARY_PATH="./assets/:$LD_LIBRARY_PATH:/usr/lib"

./SectorSix
I simply compile the game and then manually add files in a red rectangle + run.sh and steamapp_id.txt
steamapp_id.txt simply contains the app ID.

Oh, just out of interest, did you actually find it worth it to make your game available to Linux users, if you don't mind my asking? - not asking for numbers of course, but just, was the market / were sales satisfactory / worth the effort? - I'm just wondering if I'm going crazy here, for a potentially lost cause?- I'd rather know if there simply doesn't seem to be a decent market for a Linux version, given the effort and stress this seems to be!
Out of all sales, Linux is <1%.

Still worth it because Linux users are best users =]
 

Japster

Member
@Zuurix - Wow! - This is really, really helpful mate! :D

Many thanks for the kind advice, fast response, and detailed, open info and examples - seriously, hugely appreciated.... :)

I'll give it another go, and point noted - I'll try to cater to this user base then!... :)

I've also had issues trying to get Steam to actually run the Linux build within Linux Steam (it actually copies the correct / Linux files, but stubbornly tries to execute the Windows launch option (TetraLogical.exe), even though I clearly specify this option is for Windows only, and have a separate Linux option, with just "TetraLogical" (the executable filename in Linux) - weird...

So if I add a "run.sh", set THAT as the executable option for Linux, do you run this every time for your game please mate? - ie. export the SO's every time? - or is it that if they're already exported to /usr/lib, it won't actually copy anything after the 1st run? :)

Sorry, more questions I know!

Many thanks again.... :D
 

Phoebe Klim

Member
So if I add a "run.sh", set THAT as the executable option for Linux, do you run this every time for your game please mate? - ie. export the SO's every time? - or is it that if they're already exported to /usr/lib, it won't actually copy anything after the 1st run?
Yes, run.sh as a launch option. My setup is what worked for my players, I don't know what it does for sure.
 
A

Auroriax

Guest
I've just been able to solve this problem (in Game Maker Studio 2.2.3) mostly by just referencing this thread, thank you all for documenting it all so thoroughly!

One thing that I would like to add is where to get a recent version of libcurl4 via Windows. Steam tries to use an outdated version on Ubuntu (4.2.0 I believe), which causes the "version 'CURL_OPENSSL_4' not found" error. To manually add a more recent version of libcurl, I ended up downloading the version I needed from https://packages.ubuntu.com/bionic/amd64/libcurl4/download (the download link is in the middle of the page) , unzipped it with 7zip and added libcurl.so.4 and libcurl.so.4.5.0 to my Game Maker project as included files. I am pretty sure this is not the best practice, and you might need a different version depending on your computer's architecture, but it worked for me on a Ubuntu 18.04 virtual machine. (My setup is otherwise very simillar to Zuurix's.)

I also added the run.sh and steam_appid.txt as included files. Make sure to save the Bash file with Linux-style (LF, not CRLF) line endings.

Another tidbit that might be useful is that you can boot Steam from the terminal with:
Code:
/usr/bin/steam $U
or simply
Code:
steam
If you then attempt to launch the game from the Steam GUI, any logs from your game will also be logged in the terminal window, which is super handy for debugging.

Thanks again!
 
T

Tekuzo

Guest
I still can't seem to get this to work.

I added the steam_appid.txt with my app id in the txt file.

I downloaded libcurl.so.4, libcurl.so.4.5.0 and libsteam_api.so

I put those 3 files in my game's root folder.

I made the run.sh file

Code:
#!/bin/bash
export LD_LIBRARY_PATH="./assets/:$LD_LIBRARY_PATH:/usr/lib"
./Vagrant_Sword
Inside of steam when I set the launch options for the Linux depot do I use run.sh or ./run.sh?

Here is my output when I try to run the game
Code:
GameAction [AppID 1439550, ActionID 9] : LaunchApp changed task to ProcessingInstallScript with ""
GameAction [AppID 1439550, ActionID 9] : LaunchApp changed task to SiteLicenseSeatCheckout with ""
GameAction [AppID 1439550, ActionID 9] : LaunchApp changed task to CreatingProcess with ""
GameAction [AppID 1439550, ActionID 9] : LaunchApp waiting for user response to CreatingProcess ""
GameAction [AppID 1439550, ActionID 9] : LaunchApp continues with user response "CreatingProcess"
Game update: AppID 1439550 "", ProcID 5745, IP 0.0.0.0:0
ERROR: ld.so: object '/home/steven/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
Starting app 1439550
>>> Adding process 5745 for game ID 1439550
GameAction [AppID 1439550, ActionID 9] : LaunchApp changed task to WaitingGameWindow with ""
ERROR: ld.so: object '/home/steven/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
ERROR: ld.so: object '/home/steven/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
./Vagrant_Sword: /home/steven/.local/share/Steam/ubuntu12_32/steam-runtime/pinned_libs_64/libcurl.so.4: version `CURL_OPENSSL_4' not found (required by ./Vagrant_Sword)
GameAction [AppID 1439550, ActionID 9] : LaunchApp changed task to Completed with ""
>>> Adding process 5746 for game ID 1439550
Game removed: AppID 1439550 "", ProcID 5745 
Uploaded AppInterfaceStats to Steam
Exiting app 1439550
No cached sticky mapping in ActivateActionSet.
When I use a terminal and navigate to the directory and try to execute it directly, it will run with no problem.
When I use the terminal to execute run.sh directly it also runs with no problem.

I am just about at my wits end with this.
 
T

Tekuzo

Guest
And I just got it to work.
I was a goof. I put the libcurl.so files in my assets directory instead of the root and it ran.

I just didn't follow the instructions closely enough.

Thank You.
 

Darkgot

Member
Kill me now.
What a gigantic lost of time. I hope someone from YoYo games read this thread and include those files in the asset folder automatically when you compile for linux + steam. ( And don’t forget the batch to include the lib path ).
Do we have to tell the cook what he should put in his soup for it to be eatable?
 
Last edited:
Top