vmbase: Support Bionic errno, abort(), FORTIFY_SOURCE

Add support for fundamental dependencies of Bionic libc functions we are
about to need.

Bug: 256148034
Bug: 256827715
Test: m pvmfw_img && atest vmbase_example.integration_test
Change-Id: Ie85b45ad3ff8b3299a58e28dd87c9acc811f1a9f
diff --git a/vmbase/src/bionic.rs b/vmbase/src/bionic.rs
index 8b3a076..b4a2f7b 100644
--- a/vmbase/src/bionic.rs
+++ b/vmbase/src/bionic.rs
@@ -14,6 +14,11 @@
 
 //! Low-level compatibility layer between baremetal Rust and Bionic C functions.
 
+use core::ffi::c_char;
+use core::ffi::c_int;
+use core::ffi::CStr;
+
+use crate::eprintln;
 use crate::linker;
 
 /// Reference to __stack_chk_guard.
@@ -23,3 +28,37 @@
 extern "C" fn __stack_chk_fail() -> ! {
     panic!("stack guard check failed");
 }
+
+/// Called from C to cause abnormal program termination.
+#[no_mangle]
+extern "C" fn abort() -> ! {
+    panic!("C code called abort()")
+}
+
+/// Error number set and read by C functions.
+pub static mut ERRNO: c_int = 0;
+
+#[no_mangle]
+unsafe extern "C" fn __errno() -> *mut c_int {
+    &mut ERRNO as *mut _
+}
+
+/// Reports a fatal error detected by Bionic.
+///
+/// # Safety
+///
+/// Input strings `prefix` and `format` must be properly NULL-terminated.
+///
+/// # Note
+///
+/// This Rust functions is missing the last argument of its C/C++ counterpart, a va_list.
+#[no_mangle]
+unsafe extern "C" fn async_safe_fatal_va_list(prefix: *const c_char, format: *const c_char) {
+    let prefix = CStr::from_ptr(prefix);
+    let format = CStr::from_ptr(format);
+
+    if let (Ok(prefix), Ok(format)) = (prefix.to_str(), format.to_str()) {
+        // We don't bother with printf formatting.
+        eprintln!("FATAL BIONIC ERROR: {prefix}: \"{format}\" (unformatted)");
+    }
+}