What is the programmatic way to obtain the path to the base directory?

On v1.7, using a downloaded binary,

joinpath(Sys.BINDIR, Base.DATAROOTDIR, "julia", "base")

returns the path to the base directory. On v1.9, however, this has changed, and now

julia> joinpath(Sys.BINDIR, Base.DATAROOTDIR, "julia", "base") |> isdir


julia> joinpath(Sys.BINDIR, Base.DATAROOTDIR, "julia", "src", "base")

is the new path (there is an extra “src” in the path). This seems to have broken Revise.jl, and it is unable to track Base anymore. The issue, however, was that Revise was relying on a hack-y way to determine this path in the first place. This brings me to my question: is there a systematic way to obtain this path, one that would remain unchanged across releases?