This is actually a pretty common flaw in almost ALL the Dikurivatives out there.
In Ye Olden Days, somebody assumed you'd want to start the driver from the world directory. That's probably because before OLC, you had to add rooms by doing things like "vi tinyworld.wld", and once done, you'd probably want to run the driver to see if you screwed up.
So, paths ended up being written like "../player" and "../etc". Very bad practice. If you're not using absolute paths, you probably should refer to all files from a common top level, and make sure you're AT that top level before you go very far in the boot process.
I'd probably suggest writing a bit of code to use stat() to see if the first file you touch is present, and if not, try doing a chdir(".."

and try again. If it still fails, abort and cry at the user saying you can't find whatever that file is.
In my case, I've been too lazy to check for a file, but I do this:
if (chdir(dir) < 0) {
log_fatal("Cannot change directory to %s", dir);
proper_exit(MUD_HALT);
}
log_boot("Using %s as data directory.", dir);
dir is set to either a constant (default is "../lib"

, or a command line argument.
So, I'm guilty too... but at least I only refer to parent directories ONCE, and never again anywhere in the code. The proper way is to use stat() to see if some known file exists in the right place (IE: "wld/tinyworld.wld" for me) and then try to chdir() if it isn't.
You can work around it by having your boot script put you in the right place, but then you're unhappy if you try to run the game in gdb by hand.