Ah, I didn't know you didn't specify one. Now I see the "bug" you're referring to.
Yes according to the code it does use the program name to determine it:
std::string work_dir = cwork_dir;
if ( work_dir.empty() )
{
// If no working directory provided, try to divine one from the program name
//
size_t pos = prog.find_last_of( "/\\" );
if ( pos != std::string::npos )
work_dir = prog.substr( 0, pos );
}
So yes, that will create a mess if you have a relative path that is not the same number of levels down as up. If you want to use relative paths you'll probably need to explicitly specify the executable name (without the path) and the working dir separately, so it doesn't try to navigate the relative paths twice (one when it changes the working dir, and again with the actual process name).
This could be fixed in the code by removing the path from the executable path, if it was "divined".