image_util: use qemu to run native ldconfig

New glibc(glibc 2.16+) does not support generating ld.so.cache for
arm on x86 architectures. This change uses qemu to run native ldconfig
for arm platforms.

BUG=chromium:378377
TEST=the daisy image has the right ld.so.cache with glibc 2.19

Change-Id: Ib0193eda1511031678285facabf6546268f773ce
Reviewed-on: https://chromium-review.googlesource.com/201877
Reviewed-by: Jorge Lucangeli Obes <jorgelo@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Yunlian Jiang <yunlian@chromium.org>
Tested-by: Yunlian Jiang <yunlian@chromium.org>
diff --git a/build_library/base_image_util.sh b/build_library/base_image_util.sh
index cda848b..1a5317a 100755
--- a/build_library/base_image_util.sh
+++ b/build_library/base_image_util.sh
@@ -118,7 +118,7 @@
   emerge_to_image --root="${root_fs_dir}" ${BASE_PACKAGE}
 
   # Run ldconfig to create /etc/ld.so.cache.
-  sudo ldconfig -r "${root_fs_dir}"
+  run_ldconfig "${root_fs_dir}"
 
   # Set /etc/lsb-release on the image.
   "${OVERLAY_CHROMEOS_DIR}/scripts/cros_set_lsb_release" \
diff --git a/build_library/build_image_util.sh b/build_library/build_image_util.sh
index 149d95c..a91015e 100755
--- a/build_library/build_image_util.sh
+++ b/build_library/build_image_util.sh
@@ -230,3 +230,18 @@
   )
   sudo_multi "${cmds[@]}"
 }
+
+# ldconfig cannot generate caches for non-native arches.
+# Use qemu & the native ldconfig to work around that.
+# http://crbug.com/378377
+run_ldconfig() {
+  local root_fs_dir=$1
+  case ${ARCH} in
+  arm)
+    sudo qemu-arm "${root_fs_dir}"/sbin/ldconfig -r "${root_fs_dir}";;
+  x86|amd64)
+    sudo ldconfig -r "${root_fs_dir}";;
+  *)
+    die "Unable to run ldconfig for ARCH ${ARCH}"
+  esac
+}
diff --git a/build_library/dev_image_util.sh b/build_library/dev_image_util.sh
index f550c32..2d13636 100755
--- a/build_library/dev_image_util.sh
+++ b/build_library/dev_image_util.sh
@@ -61,7 +61,7 @@
   sudo mkdir -p ${root_fs_dir}/etc/make.profile
 
   # Re-run ldconfig to fix /etc/ld.so.cache.
-  sudo ldconfig -r "${root_fs_dir}"
+  run_ldconfig "${root_fs_dir}"
 
   # Additional changes to developer image.
   sudo mkdir -p "${root_fs_dir}/root"
diff --git a/build_library/test_image_util.sh b/build_library/test_image_util.sh
index c380498..d3f263e 100755
--- a/build_library/test_image_util.sh
+++ b/build_library/test_image_util.sh
@@ -57,7 +57,7 @@
   fi
 
   # Re-run ldconfig to fix /etc/ld.so.cache.
-  sudo ldconfig -r "${root_fs_dir}"
+  run_ldconfig "${root_fs_dir}"
 
   cleanup_mounts
   trap - EXIT