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}"/