Add the .sdata section to the app binary.

RISC-V has the .sdata section, which is supposed to be for commonly-accessed global variables. Previously, we discarded this section in the linker script. Discarding this section resulted in missing global variables.

I originally discovered this when I tried to print a string of less than 9 bytes and it was not working. I reported it as a kernel bug at https://github.com/tock/tock/issues/2132, then later realized the issue was in the libtock-rs linker script rather than the kernel.

I added a test to libtock_test that catches this issue (I verified by hand that the test fails if I don't fix the linker script).
diff --git a/examples-features/libtock_test.rs b/examples-features/libtock_test.rs
index ac2cb48..a938f46 100644
--- a/examples-features/libtock_test.rs
+++ b/examples-features/libtock_test.rs
@@ -10,6 +10,7 @@
 use core::future::Future;
 use core::mem;
 use core::pin::Pin;
+use core::ptr::read_volatile;
 use core::task::Context;
 use core::task::Poll;
 use libtock::console::ConsoleDriver;
@@ -46,6 +47,7 @@
     gpio: &mut GpioDriverFactory,
 ) -> TockResult<()> {
     test.console()?;
+    test.sdata()?;
     test.static_mut()?;
     test.dynamic_dispatch()?;
     test.formatting()?;
@@ -72,6 +74,21 @@
         self.log_success("Console")
     }
 
+    // RISC-V has the .sdata section, which is ostensibly for commonly-accessed
+    // read-write global variables. In practice, the Rust compiler tends to put
+    // small globals (<= 8 bytes) into it. This test verifies that small
+    // data symbols are accessible.
+    fn sdata(&mut self) -> TockResult<()> {
+        static mut SDATA: [u8; 4] = [1, 2, 3, 4];
+        // Use volatile reads to prevent the compiler from constant-folding
+        // everything away.
+        let sdata_ptr = unsafe { &SDATA } as *const u8;
+        let sum = (0..4)
+            .map(|i| unsafe { read_volatile(sdata_ptr.offset(i)) })
+            .sum::<u8>();
+        self.check_if_true(sum == 10, "sdata")
+    }
+
     fn static_mut(&mut self) -> TockResult<()> {
         self.check_if_true(increment_static_mut() == 1, "static mut")
     }
diff --git a/layout_generic.ld b/layout_generic.ld
index dd101ab..3c5065c 100644
--- a/layout_generic.ld
+++ b/layout_generic.ld
@@ -113,6 +113,7 @@
         . = ALIGN(4); /* Make sure we're word-aligned here */
         _data = .;
         KEEP(*(.data*))
+        *(.sdata*) /* RISC-V small-pointer data section */
         . = ALIGN(4); /* Make sure we're word-aligned at the end of flash */
     } > SRAM