Fix cross-prefix bugs, and test.

* Fix create_trees to correctly handle the case where ROOT=/ for two
  different EPREFIX offsets.
* For best/has_version, handle the case where ROOT=/ for bug prefixes,
  though each has a different EPREFIX offset.
* Use portage.const.EPREFIX for default EMERGE_LOG_DIR offset, which
  is analogous to existing un-prefixed behavior.
* Use portage.const.EPREFIX for default PORTAGE_CONFIGROOT, which is
  analogous to existing un-prefixed behavior.
* Add cross-prefix cases to emerge tests, including chpathtool for
  binpkgs.
diff --git a/bin/phase-helpers.sh b/bin/phase-helpers.sh
index 3d51eb0..ba12f1f 100644
--- a/bin/phase-helpers.sh
+++ b/bin/phase-helpers.sh
@@ -676,7 +676,10 @@
 	fi
 
 	if ___eapi_has_prefix_variables; then
-		if [[ ${root} == / ]] ; then
+		# [[ ${root} == / ]] would be ambiguous here,
+		# since both prefixes can share root=/ while
+		# having different EPREFIX offsets.
+		if ${host_root} ; then
 			eroot=${root%/}${PORTAGE_OVERRIDE_EPREFIX}/
 		else
 			eroot=${root%/}${EPREFIX}/
@@ -732,7 +735,10 @@
 	fi
 
 	if ___eapi_has_prefix_variables; then
-		if [[ ${root} == / ]] ; then
+		# [[ ${root} == / ]] would be ambiguous here,
+		# since both prefixes can share root=/ while
+		# having different EPREFIX offsets.
+		if ${host_root} ; then
 			eroot=${root%/}${PORTAGE_OVERRIDE_EPREFIX}/
 		else
 			eroot=${root%/}${EPREFIX}/
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py
index b331b10..c31ad1d 100644
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@ -3800,8 +3800,7 @@
 				_emerge.emergelog._emerge_log_dir = emerge_log_dir
 		else:
 			_emerge.emergelog._emerge_log_dir = os.path.join(os.sep,
-				emerge_config.target_config.settings["EPREFIX"].lstrip(os.sep),
-				"var", "log")
+				portage.const.EPREFIX.lstrip(os.sep), "var", "log")
 			portage.util.ensure_dirs(_emerge.emergelog._emerge_log_dir)
 
 	if not "--pretend" in emerge_config.opts:
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index 2510f86..7656c6e 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -577,7 +577,7 @@
 
 	trees._target_eroot = settings['EROOT']
 	myroots = [(settings['EROOT'], settings)]
-	if settings["ROOT"] == "/":
+	if settings["ROOT"] == "/" and settings["EPREFIX"] == const.EPREFIX:
 		trees._running_eroot = trees._target_eroot
 	else:
 
@@ -593,7 +593,7 @@
 			if v is not None:
 				clean_env[k] = v
 		settings = config(config_root=None, target_root="/",
-			env=clean_env, eprefix=eprefix)
+			env=clean_env, eprefix=None)
 		settings.lock()
 		trees._running_eroot = settings['EROOT']
 		myroots.append((settings['EROOT'], settings))
diff --git a/pym/portage/package/ebuild/_config/LocationsManager.py b/pym/portage/package/ebuild/_config/LocationsManager.py
index 7e799b8..e328441 100644
--- a/pym/portage/package/ebuild/_config/LocationsManager.py
+++ b/pym/portage/package/ebuild/_config/LocationsManager.py
@@ -49,7 +49,7 @@
 			self.eprefix = portage.const.EPREFIX
 
 		if self.config_root is None:
-			self.config_root = self.eprefix + os.sep
+			self.config_root = portage.const.EPREFIX + os.sep
 
 		self.config_root = normalize_path(os.path.abspath(
 			self.config_root)).rstrip(os.path.sep) + os.path.sep
diff --git a/pym/portage/tests/emerge/test_simple.py b/pym/portage/tests/emerge/test_simple.py
index c1abd52..dc7ddb7 100644
--- a/pym/portage/tests/emerge/test_simple.py
+++ b/pym/portage/tests/emerge/test_simple.py
@@ -201,6 +201,8 @@
 		test_ebuild = portdb.findname("dev-libs/A-1")
 		self.assertFalse(test_ebuild is None)
 
+		cross_prefix = os.path.join(eprefix, "cross_prefix")
+
 		test_commands = (
 			env_update_cmd,
 			portageq_cmd + ("envvar", "-v", "CONFIG_PROTECT", "EROOT",
@@ -266,6 +268,24 @@
 			emerge_cmd + ("-p", "--unmerge", "-q", eroot + "usr"),
 			emerge_cmd + ("--unmerge", "--quiet", "dev-libs/A"),
 			emerge_cmd + ("-C", "--quiet", "dev-libs/B"),
+
+			# Test cross-prefix usage, including chpathtool for binpkgs.
+			({"EPREFIX" : cross_prefix},) + \
+				emerge_cmd + ("--usepkgonly", "dev-libs/A"),
+			({"EPREFIX" : cross_prefix},) + \
+				portageq_cmd + ("has_version", cross_prefix, "dev-libs/A"),
+			({"EPREFIX" : cross_prefix},) + \
+				portageq_cmd + ("has_version", cross_prefix, "dev-libs/B"),
+			({"EPREFIX" : cross_prefix},) + \
+				emerge_cmd + ("-C", "--quiet", "dev-libs/B"),
+			({"EPREFIX" : cross_prefix},) + \
+				emerge_cmd + ("-C", "--quiet", "dev-libs/A"),
+			({"EPREFIX" : cross_prefix},) + \
+				emerge_cmd + ("dev-libs/A",),
+			({"EPREFIX" : cross_prefix},) + \
+				portageq_cmd + ("has_version", cross_prefix, "dev-libs/A"),
+			({"EPREFIX" : cross_prefix},) + \
+				portageq_cmd + ("has_version", cross_prefix, "dev-libs/B"),
 		)
 
 		distdir = playground.distdir