diff --git a/explorer/main_bin.cpp b/explorer/main_bin.cpp index 02902edb32e5..8b1aece01f83 100644 --- a/explorer/main_bin.cpp +++ b/explorer/main_bin.cpp @@ -8,13 +8,15 @@ #include "llvm/Support/Path.h" auto main(int argc, char** argv) -> int { - // This assumes execution from bazel, in runfiles. - llvm::SmallString<256> prelude_path; - if (std::error_code err = llvm::sys::fs::current_path(prelude_path)) { - llvm::errs() << "Failed to get working directory: " << err.message(); - return 1; - } - llvm::sys::path::append(prelude_path, "explorer/data/prelude.carbon"); + // This assumes execution from `bazel-bin/explorer`, either directly or with + // `bazel run`. + static int static_for_main_addr; + std::string exe = llvm::sys::fs::getMainExecutable( + argv[0], static_cast(&static_for_main_addr)); + llvm::SmallString<256> prelude_path = llvm::sys::path::parent_path(exe); + llvm::sys::path::append(prelude_path, "explorer.runfiles", "carbon", + "explorer", "data"); + llvm::sys::path::append(prelude_path, "prelude.carbon"); // Behave as if the working directory is where `bazel run` was invoked. char* build_working_dir = getenv("BUILD_WORKING_DIRECTORY");