Only write main library's RELRO by default.
ANDROID_DLEXT_WRITE_RELRO was inadvertently writing out the RELRO
section of all libraries loaded during a given dlopen() call instead of
only the main library; since the other libraries are loaded at
unpredictable addresses this additional data is rarely useful.
Fix this to only happen when the
ANDROID_DLEXT_RESERVED_ADDRESS_RECURSIVE flag is being used.
Bug: 128623590
Test: DlExtRelroSharingTest.CheckRelroSizes
Change-Id: I05e8651d06ce2de77b8c85fe2b6238f9c09691ad
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index 1bc5030..7262fac 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -524,6 +524,26 @@
tf.fd = extinfo_.relro_fd;
}
+TEST_F(DlExtRelroSharingTest, CheckRelroSizes) {
+ TemporaryFile tf1, tf2;
+ ASSERT_NOERROR(close(tf1.fd));
+ ASSERT_NOERROR(close(tf2.fd));
+
+ ASSERT_NO_FATAL_FAILURE(CreateRelroFile(kLibNameRecursive, tf1.path, false));
+ struct stat no_recursive;
+ ASSERT_NOERROR(fstat(extinfo_.relro_fd, &no_recursive));
+ tf1.fd = extinfo_.relro_fd;
+
+ ASSERT_NO_FATAL_FAILURE(CreateRelroFile(kLibNameRecursive, tf2.path, true));
+ struct stat with_recursive;
+ ASSERT_NOERROR(fstat(extinfo_.relro_fd, &with_recursive));
+ tf2.fd = extinfo_.relro_fd;
+
+ // RELRO file should end up bigger when we use the recursive flag, since it
+ // includes data for more than one library.
+ ASSERT_GT(with_recursive.st_size, no_recursive.st_size);
+}
+
TEST_F(DlExtRelroSharingTest, ChildWritesNoRelro) {
TemporaryFile tf; // // Use tf to get an unique filename.
ASSERT_NOERROR(close(tf.fd));