Snap for 12205827 from 1981ad2f0eab22577f4542e30a7d00ae11c1b44a to 24Q4-release

Change-Id: I23e6ec014ce0c652251d67b689b9955406325da4
diff --git a/loader/Android.bp b/loader/Android.bp
index 1e7ece8..5854f86 100644
--- a/loader/Android.bp
+++ b/loader/Android.bp
@@ -59,6 +59,28 @@
     ],
 }
 
+rust_bindgen {
+    name: "libbpf_android_bindgen",
+    crate_name: "bpf_android_bindgen",
+    wrapper_src: "include/libbpf_android.h",
+    source_stem: "bindings",
+    bindgen_flags: [
+        "--verbose",
+    ],
+    cflags: [
+        "-Werror",
+        "-Wall",
+        "-Wextra",
+        "-Wno-pragma-once-outside-header",
+    ],
+    shared_libs: [
+        "libbase",
+        "libutils",
+        "liblog",
+        "libbpf_android",
+    ],
+}
+
 cc_test {
     name: "libbpf_load_test",
     test_suites: ["general-tests"],
@@ -89,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();
+    }
+}