loader: set PT_INTERP to itself
Some versions of kernel set AT_BASE to 0
if dynamic loader does not have PT_INTERP
set.
Bug: http://b/30739481
Test: run /system/bin/linker64 and /system/bin/linker
Change-Id: I1b67777166fe917d3ee1a97277045ca6f5db0084
diff --git a/linker/Android.bp b/linker/Android.bp
index aab05b4..a43f8b3 100644
--- a/linker/Android.bp
+++ b/linker/Android.bp
@@ -39,29 +39,35 @@
srcs: ["arch/arm/begin.S"],
cflags: ["-D__work_around_b_24465209__"],
+ ldflags: ["-Wl,-dynamic-linker,/system/bin/linker"],
},
arm64: {
srcs: ["arch/arm64/begin.S"],
+ ldflags: ["-Wl,-dynamic-linker,/system/bin/linker64"],
},
x86: {
srcs: ["arch/x86/begin.c"],
cflags: ["-D__work_around_b_24465209__"],
+ ldflags: ["-Wl,-dynamic-linker,/system/bin/linker"],
},
x86_64: {
srcs: ["arch/x86_64/begin.S"],
+ ldflags: ["-Wl,-dynamic-linker,/system/bin/linker64"],
},
mips: {
srcs: [
"arch/mips/begin.S",
"linker_mips.cpp",
],
+ ldflags: ["-Wl,-dynamic-linker,/system/bin/linker"],
},
mips64: {
srcs: [
"arch/mips64/begin.S",
"linker_mips.cpp",
],
+ ldflags: ["-Wl,-dynamic-linker,/system/bin/linker64"],
},
},
diff --git a/linker/linker_main.cpp b/linker/linker_main.cpp
index d52b1d6..d037a18 100644
--- a/linker/linker_main.cpp
+++ b/linker/linker_main.cpp
@@ -496,7 +496,7 @@
// see also https://code.google.com/p/android/issues/detail?id=63174
if (reinterpret_cast<ElfW(Addr)>(&_start) == entry_point) {
__libc_format_fd(STDOUT_FILENO,
- "This is %s, the helper program for shared library executables.\n",
+ "This is %s, the helper program for dynamic executables.\n",
args.argv[0]);
exit(0);
}
diff --git a/tests/dl_test.cpp b/tests/dl_test.cpp
index 74c7b51..ee9b2e1 100644
--- a/tests/dl_test.cpp
+++ b/tests/dl_test.cpp
@@ -24,6 +24,8 @@
#include <string>
+#include "utils.h"
+
extern "C" int main_global_default_serial() {
return 3370318;
}
@@ -69,4 +71,19 @@
ASSERT_EQ(3370318, lib_global_protected_get_serial());
}
+TEST(dl, exec_linker) {
+#if defined(__BIONIC__)
+#if defined(__LP64__)
+ static constexpr const char* kPathToLinker = "/system/bin/linker64";
+#else
+ static constexpr const char* kPathToLinker = "/system/bin/linker";
+#endif
+ ExecTestHelper eth;
+ std::string expected_output = std::string("This is ") + kPathToLinker +
+ ", the helper program for dynamic executables.\n";
+ eth.SetArgs( { kPathToLinker, nullptr });
+ eth.Run([&]() { execve(kPathToLinker, eth.GetArgs(), eth.GetEnv()); }, 0, expected_output.c_str());
+#endif
+}
+
// TODO: Add tests for LD_PRELOADs