diff --git a/frontends/libretro/src/lib.rs b/frontends/libretro/src/lib.rs
index be3d6fbe003863cd5cecfd063a256376f4a69bd8..1dd130f2822f648113541695588249b7ea0d94e3 100644
--- a/frontends/libretro/src/lib.rs
+++ b/frontends/libretro/src/lib.rs
@@ -29,9 +29,25 @@ use std::{
     slice::from_raw_parts,
 };
 
+/// Represents the information about the LibRetro extension
+/// to be used in a static context. Handles strings at the
+/// byte buffer level and also at the C string level.
+struct LibRetroInfo {
+    name: &'static str,
+    version: &'static str,
+    name_s: String,
+    version_s: String
+}
+
 static mut EMULATOR: Option<GameBoy> = None;
 static mut KEY_STATES: Option<HashMap<RetroJoypad, bool>> = None;
 static mut FRAME_BUFFER: [u32; FRAME_BUFFER_SIZE] = [0x00; FRAME_BUFFER_SIZE];
+static mut INFO: LibRetroInfo = LibRetroInfo {
+    name: "",
+    version: "",
+    name_s: String::new(),
+    version_s: String::new()
+};
 
 static mut PENDING_CYCLES: u32 = 0_u32;
 
@@ -154,6 +170,10 @@ pub extern "C" fn retro_init() {
     unsafe {
         EMULATOR = Some(GameBoy::new(None));
         KEY_STATES = Some(HashMap::new());
+        INFO.name_s = format!("{}\0", Info::name());
+        INFO.name = INFO.name_s.as_str();
+        INFO.version_s = format!("v{}\0", Info::version());
+        INFO.version = INFO.version_s.as_str();
     }
 }
 
@@ -175,8 +195,8 @@ pub extern "C" fn retro_reset() {
 #[no_mangle]
 pub unsafe extern "C" fn retro_get_system_info(info: *mut RetroSystemInfo) {
     debugln!("retro_get_system_info()");
-    (*info).library_name = format!("{}\0", Info::name()).as_ptr() as *const c_char;
-    (*info).library_version = format!("v{}\0", Info::version()).as_ptr() as *const c_char;
+    (*info).library_name = INFO.name.as_ptr() as *const c_char;
+    (*info).library_version = INFO.version.as_ptr() as *const c_char;
     (*info).valid_extensions = "gb|gbc\0".as_ptr() as *const c_char;
     (*info).need_fullpath = false;
     (*info).block_extract = false;