Warn loudly and do not set bpf.progs_loaded property on critical bpf load failure.

Reasoning: critical load failures for netd bpf programs will just result
in unpredictable behaviour later on.  For example netd/systemserver
crash loops.

Test: builds
Bug: 150040815
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Iefa01e60cd0a9a223e96411726a199bfb4857a5a
diff --git a/libbpf_android/Loader.cpp b/libbpf_android/Loader.cpp
index 9f57ce6..8f5318d 100644
--- a/libbpf_android/Loader.cpp
+++ b/libbpf_android/Loader.cpp
@@ -606,19 +606,21 @@
     return 0;
 }
 
-int loadProg(const char* elfPath) {
+int loadProg(const char* elfPath, bool* isCritical) {
     vector<char> license;
     vector<char> critical;
     vector<codeSection> cs;
     vector<unique_fd> mapFds;
-    bool is_critical;
     int ret;
 
+    if (!isCritical) return -1;
+    *isCritical = false;
+
     ifstream elfFile(elfPath, ios::in | ios::binary);
     if (!elfFile.is_open()) return -1;
 
     ret = readSectionByName("critical", elfFile, critical);
-    is_critical = !ret;
+    *isCritical = !ret;
 
     ret = readSectionByName("license", elfFile, license);
     if (ret) {
@@ -626,7 +628,7 @@
         return ret;
     } else {
         ALOGD("Loading %s%s ELF object %s with license %s\n",
-              is_critical ? "critical for " : "optional", is_critical ? (char*)critical.data() : "",
+              *isCritical ? "critical for " : "optional", *isCritical ? (char*)critical.data() : "",
               elfPath, (char*)license.data());
     }