BPF: Create rust bpfloader

In preparation for adding libbpf support via libbpf-rs, replace the
existing cpp bpfloader with a rust application calling into the
libbpf_android bindings to the legacy code.

Test: treehugger
Change-Id: I79eff1fece3372727c700308ff9a35029d0e34d3
Signed-off-by: Neill Kapron <nkapron@google.com>
diff --git a/loader/Android.bp b/loader/Android.bp
index ae664df..5854f86 100644
--- a/loader/Android.bp
+++ b/loader/Android.bp
@@ -111,29 +111,14 @@
     require_root: true,
 }
 
-cc_binary {
+rust_binary {
     name: "bpfloader",
-
-    defaults: ["bpf_defaults"],
-    cflags: [
-        "-Wall",
-        "-Werror",
-        "-Wthread-safety",
-    ],
-    sanitize: {
-        integer_overflow: true,
-    },
-
-    header_libs: ["bpf_headers"],
-    shared_libs: [
-        "libbase",
-        "liblog",
-    ],
-    static_libs: ["libbpf_android"],
     srcs: [
-        "BpfLoader.cpp",
+        "bpfloader.rs",
     ],
-
+    rustlibs: [
+        "libbpf_android_bindgen",
+    ],
     required: [
         "timeInState.o",
     ],
diff --git a/loader/BpfLoader.cpp b/loader/BpfLoader.cpp
deleted file mode 100644
index f180f4e..0000000
--- a/loader/BpfLoader.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <libbpf_android.h>
-
-__noreturn int main() {
-    initLogging();
-    legacyBpfLoader();
-    execNetBpfLoadDone();
-    // unreachable
-}
diff --git a/loader/bpfloader.rs b/loader/bpfloader.rs
new file mode 100644
index 0000000..0cd5e0e
--- /dev/null
+++ b/loader/bpfloader.rs
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//! BPF loader for system and vendor applications
+
+fn main() {
+    // SAFETY: Linking in the existing legacy bpfloader functionality.
+    // Any of the three following bindgen functions can abort() or exit()
+    // on failure and execNetBpfLoadDone() execve()'s.
+    unsafe {
+        bpf_android_bindgen::initLogging();
+        bpf_android_bindgen::legacyBpfLoader();
+        bpf_android_bindgen::execNetBpfLoadDone();
+    }
+}