Downgrade W+E load segments to a warning unless targeting O.

I don't think we're getting any value from more dupes of the same dodgy
middleware, and I worry that we're hiding other, more subtle, compatibility
issues behind this one.

Test: bionic tests
Change-Id: I556cf36eac96c90976bae32621d1c133bbb8fcc7
diff --git a/android-changes-for-ndk-developers.md b/android-changes-for-ndk-developers.md
index 11648fa..069b004 100644
--- a/android-changes-for-ndk-developers.md
+++ b/android-changes-for-ndk-developers.md
@@ -218,6 +218,6 @@
   LOAD           0x000000 0x00000000 0x00000000 0x4c01d 0x4c01d RWE 0x1000
 ```
 
-*Resolution*: right now we're not actually sure where these are coming
-from, so if you find and fix these in your app, please let us know how
-they snuck in!
+*Resolution*: we're aware of one middleware product that introduces these
+into your app. The middleware vendor is aware of the problem and has a fix
+available.
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp
index bced722..5b0ee49 100644
--- a/linker/linker_phdr.cpp
+++ b/linker/linker_phdr.cpp
@@ -36,6 +36,7 @@
 #include <unistd.h>
 
 #include "linker.h"
+#include "linker_dlwarning.h"
 #include "linker_globals.h"
 #include "linker_debug.h"
 #include "linker_utils.h"
@@ -605,10 +606,14 @@
 
     if (file_length != 0) {
       int prot = PFLAGS_TO_PROT(phdr->p_flags);
-      // W + E PT_LOAD segments are not allowed.
       if ((prot & (PROT_EXEC | PROT_WRITE)) == (PROT_EXEC | PROT_WRITE)) {
-        DL_ERR_AND_LOG("\"%s\": W + E load segments are not allowed", name_.c_str());
-        return false;
+        // W + E PT_LOAD segments are not allowed in O.
+        if (get_application_target_sdk_version() > 25) {
+          DL_ERR_AND_LOG("\"%s\": W + E load segments are not allowed", name_.c_str());
+          return false;
+        }
+        DL_WARN("\"%s\": W + E load segments are not allowed", name_.c_str());
+        add_dlwarning(name_.c_str(), "W+E load segments");
       }
 
       void* seg_addr = mmap64(reinterpret_cast<void*>(seg_page_start),