diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-04-23 17:41:43 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-04-23 17:41:43 +0000 |
commit | 768eb27f0d09a779150c9d4fe1f0262601598a1d (patch) | |
tree | 989739f07aaec01e7581f4f263e059d67586ecdf | |
parent | 84cb324786ed7db7a13349106f0f626ed54807ee (diff) | |
parent | ebfebd057a5a07d17108362aa0afa9a047cfe9ea (diff) | |
download | android_bionic-768eb27f0d09a779150c9d4fe1f0262601598a1d.tar.gz android_bionic-768eb27f0d09a779150c9d4fe1f0262601598a1d.tar.bz2 android_bionic-768eb27f0d09a779150c9d4fe1f0262601598a1d.zip |
Merge "Only write main library's RELRO by default." into qt-dev
-rw-r--r-- | linker/linker.cpp | 10 | ||||
-rw-r--r-- | tests/dlext_test.cpp | 20 |
2 files changed, 28 insertions, 2 deletions
diff --git a/linker/linker.cpp b/linker/linker.cpp index d62eaec39..b59df7302 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1865,11 +1865,17 @@ bool find_libraries(android_namespace_t* ns, soinfo_list_t global_group = local_group_ns->get_global_group(); bool linked = local_group.visit([&](soinfo* si) { - // Even though local group may contain accessible soinfos from other namesapces + // Even though local group may contain accessible soinfos from other namespaces // we should avoid linking them (because if they are not linked -> they // are in the local_group_roots and will be linked later). if (!si->is_linked() && si->get_primary_namespace() == local_group_ns) { - if (!si->link_image(global_group, local_group, extinfo, &relro_fd_offset) || + const android_dlextinfo* link_extinfo = nullptr; + if (si == soinfos[0] || reserved_address_recursive) { + // Only forward extinfo for the first library unless the recursive + // flag is set. + link_extinfo = extinfo; + } + if (!si->link_image(global_group, local_group, link_extinfo, &relro_fd_offset) || !get_cfi_shadow()->AfterLoad(si, solist_get_head())) { return false; } diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp index 3af52d47c..eed84a4c1 100644 --- a/tests/dlext_test.cpp +++ b/tests/dlext_test.cpp @@ -538,6 +538,26 @@ TEST_F(DlExtRelroSharingTest, ChildWritesGoodDataRecursive) { 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)); |