Changes to make virglrender use the libraries in $ORIGIN

This consists of 3 parts:

* Move the libraries into the bin folder to better approximate their
  final location

* Add a script to look for library references to the global system
  libraries to keep this from happening again

* Modify the build configuration to search $ORIGIN when virglrenderer
  loads its libraries

BUG: 139949390
Test: Script fails on bad files, works on good ones
Test: ARM and x86 crosvm boot
Change-Id: I95a5947a659b158933072efc9f8eef58762f82b5
diff --git a/Android.bp b/Android.bp
index b006159..3648d71 100644
--- a/Android.bp
+++ b/Android.bp
@@ -41,7 +41,7 @@
 // Using cc_prebuilt_binary because cc_prebuild_library can't handle stem on pie
 cc_prebuilt_binary {
   name: "aarch64_linux_gnu_libepoxy.so.0_for_crosvm",
-  srcs: ["aarch64-linux-gnu/lib/libepoxy.so.0"],
+  srcs: ["aarch64-linux-gnu/bin/libepoxy.so.0"],
   stem: "libepoxy.so.0",
   relative_install_path: "aarch64-linux-gnu",
   defaults: ["cuttlefish_host_only"],
@@ -50,7 +50,7 @@
 // Using cc_prebuilt_binary because cc_prebuild_library can't handle stem on pie
 cc_prebuilt_binary {
   name: "aarch64_linux_gnu_libgbm.so.1_for_crosvm",
-  srcs: ["aarch64-linux-gnu/lib/libgbm.so.1"],
+  srcs: ["aarch64-linux-gnu/bin/libgbm.so.1"],
   stem: "libgbm.so.1",
   relative_install_path: "aarch64-linux-gnu",
   defaults: ["cuttlefish_host_only"],
@@ -59,7 +59,7 @@
 // Using cc_prebuilt_binary because cc_prebuild_library can't handle stem on pie
 cc_prebuilt_binary {
   name: "aarch64_linux_gnu_libminijail.so_for_crosvm",
-  srcs: ["aarch64-linux-gnu/lib/libminijail.so"],
+  srcs: ["aarch64-linux-gnu/bin/libminijail.so"],
   stem: "libminijail.so",
   relative_install_path: "aarch64-linux-gnu",
   defaults: ["cuttlefish_host_only"],
@@ -68,7 +68,7 @@
 // Using cc_prebuilt_binary because cc_prebuild_library can't handle stem on pie
 cc_prebuilt_binary {
   name: "aarch64_linux_gnu_libvirglrenderer.so.0_for_crosvm",
-  srcs: ["aarch64-linux-gnu/lib/libvirglrenderer.so.0"],
+  srcs: ["aarch64-linux-gnu/bin/libvirglrenderer.so.0"],
   stem: "libvirglrenderer.so.0",
   relative_install_path: "aarch64-linux-gnu",
   defaults: ["cuttlefish_host_only"],
@@ -77,7 +77,7 @@
 // Using cc_prebuilt_binary because cc_prebuild_library can't handle stem on pie
 cc_prebuilt_binary {
   name: "x86_64_linux_gnu_libepoxy.so.0_for_crosvm",
-  srcs: ["x86_64-linux-gnu/lib/libepoxy.so.0"],
+  srcs: ["x86_64-linux-gnu/bin/libepoxy.so.0"],
   stem: "libepoxy.so.0",
   relative_install_path: "x86_64-linux-gnu",
   defaults: ["cuttlefish_host_only"],
@@ -86,7 +86,7 @@
 // Using cc_prebuilt_binary because cc_prebuild_library can't handle stem on pie
 cc_prebuilt_binary {
   name: "x86_64_linux_gnu_libgbm.so.1_for_crosvm",
-  srcs: ["x86_64-linux-gnu/lib/libgbm.so.1"],
+  srcs: ["x86_64-linux-gnu/bin/libgbm.so.1"],
   stem: "libgbm.so.1",
   relative_install_path: "x86_64-linux-gnu",
   defaults: ["cuttlefish_host_only"],
@@ -95,7 +95,7 @@
 // Using cc_prebuilt_binary because cc_prebuild_library can't handle stem on pie
 cc_prebuilt_binary {
   name: "x86_64_linux_gnu_libminijail.so_for_crosvm",
-  srcs: ["x86_64-linux-gnu/lib/libminijail.so"],
+  srcs: ["x86_64-linux-gnu/bin/libminijail.so"],
   stem: "libminijail.so",
   relative_install_path: "x86_64-linux-gnu",
   defaults: ["cuttlefish_host_only"],
@@ -104,7 +104,7 @@
 // Using cc_prebuilt_binary because cc_prebuild_library can't handle stem on pie
 cc_prebuilt_binary {
   name: "x86_64_linux_gnu_libvirglrenderer.so.0_for_crosvm",
-  srcs: ["x86_64-linux-gnu/lib/libvirglrenderer.so.0"],
+  srcs: ["x86_64-linux-gnu/bin/libvirglrenderer.so.0"],
   stem: "libvirglrenderer.so.0",
   relative_install_path: "x86_64-linux-gnu",
   defaults: ["cuttlefish_host_only"],
diff --git a/check_links.sh b/check_links.sh
new file mode 100755
index 0000000..cfcb797
--- /dev/null
+++ b/check_links.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# Checks that, when we define a local library, we use it everywhere
+
+pushd "$(dirname "$0")" >/dev/null 2>&1
+base="$(pwd)"
+popd >/dev/null 2>&1
+
+local_libraries=( \
+  $(find "${base}"/x86_64-linux-gnu/bin \
+         "${base}"/aarch64-linux-gnu/bin \
+         -type f -print)
+)
+
+exit_code=0
+
+for check_links_for in "${local_libraries[@]}"; do
+  library_stub="$(basename "${check_links_for}")"
+  library_stub="${library_stub/.*/}"
+  for library_to_check in "${local_libraries[@]}"; do
+    bad_links="$(ldd "${library_to_check}" | grep "${library_stub}" | grep -v "${base}" )"
+    if [[ -n "${bad_links}" ]]; then
+      echo ${library_to_check} has bad link to ${library_stub}: ${bad_links}
+      exit_code=2
+    fi
+  done
+done
+exit ${exit_code}
diff --git a/rebuild_gce.sh b/rebuild_gce.sh
index 10c3703..ed3fa56 100755
--- a/rebuild_gce.sh
+++ b/rebuild_gce.sh
@@ -4,7 +4,7 @@
 pushd "$(dirname "$0")" > /dev/null 2>&1
 OUT_DIR="$(pwd)/${ARCH}-linux-gnu"
 popd > /dev/null 2>&1
-LIB_PATH="${OUT_DIR}/lib"
+LIB_PATH="${OUT_DIR}/bin"
 REPO_DIR=${HOME}/repo
 BUILD_DIR=${HOME}/build
 export THIRD_PARTY_ROOT="${BUILD_DIR}/third_party"
@@ -107,7 +107,7 @@
 
 compile() {
   echo Compiling...
-  mkdir -p "${HOME}/lib" "${OUT_DIR}/bin" "${OUT_DIR}/lib"
+  mkdir -p "${HOME}/lib" "${OUT_DIR}/bin"
 
   # Hack to make minigbm work
   rm -rf "${HOME}/usr"
@@ -144,7 +144,8 @@
   # Note: depends on libepoxy
   cd "${THIRD_PARTY_ROOT}/virglrenderer"
   ./autogen.sh --prefix=${HOME} PKG_CONFIG_PATH=${HOME}/lib/pkgconfig \
-    --disable-egl
+    --disable-egl \
+    LDFLAGS=-Wl,-rpath,\\\$\$ORIGIN
   make -j install
   cp "${HOME}/lib/libvirglrenderer.so.0" "${LIB_PATH}"/