From 8bc1c3484cd8af74d044f5503fc078259cdca882 Mon Sep 17 00:00:00 2001 From: Ryan Prichard Date: Fri, 4 Jun 2021 13:24:10 -0700 Subject: [PATCH] Stop exporting symbols from app_process Any symbols exported from the executable override everything else in every linker namespace. Previously, app_process exported the signal/sigchain API, but that interposition is now handled by libsigchain.so. Bug: http://b/190100879 Test: `nm -D --defined-only app_process{32,64}` shows no symbols Change-Id: I1ab1fc700c34e91535c3e679a471debbb4eb71e3 (cherry picked from commit 6b86dfb159bd26bff4aa74895221e09dce7b0718) --- cmds/app_process/Android.bp | 11 ++++++++++- cmds/app_process/version-script.txt | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 cmds/app_process/version-script.txt diff --git a/cmds/app_process/Android.bp b/cmds/app_process/Android.bp index 0eff83c992827..a1575173ded62 100644 --- a/cmds/app_process/Android.bp +++ b/cmds/app_process/Android.bp @@ -29,7 +29,16 @@ cc_binary { }, }, - ldflags: ["-Wl,--export-dynamic"], + // Symbols exported from the executable in .dynsym interpose symbols in every + // linker namespace, including an app's classloader namespace. Provide this + // version script to prevent unwanted interposition. + // + // By default, the static linker doesn't export most of an executable's symbols, + // but it will export a symbol that appears to override a symbol in a needed DSO. + // This commonly happens with C++ vaguely-linked entities, such as template + // functions or type_info variables. Hence, a version script is needed even for + // an executable. + version_script: "version-script.txt", shared_libs: [ "libandroid_runtime", diff --git a/cmds/app_process/version-script.txt b/cmds/app_process/version-script.txt new file mode 100644 index 0000000000000..a98066a67675c --- /dev/null +++ b/cmds/app_process/version-script.txt @@ -0,0 +1,4 @@ +{ + local: + *; +};