[libc-commits] [libc] [libc] Enable bare-metal hermetic tests on Arm (PR #207361)

Petr Hosek via libc-commits libc-commits at lists.llvm.org
Tue Aug 25 01:20:01 PDT 2026


================
@@ -0,0 +1,154 @@
+/*===----------------------------------------------------------------------===*
+ *
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ *
+ *===----------------------------------------------------------------------===*
+ *
+ * \file
+ * Bare-metal LLVM libc test linker script.
+ *
+ *===----------------------------------------------------------------------===*/
+
+ASSERT(DEFINED(__boot_flash), "__boot_flash must be defined");
+ASSERT(DEFINED(__boot_flash_size), "__boot_flash_size must be defined");
+ASSERT(DEFINED(__flash), "__flash must be defined");
+ASSERT(DEFINED(__flash_size), "__flash_size must be defined");
+ASSERT(DEFINED(__ram), "__ram must be defined");
+ASSERT(DEFINED(__ram_size), "__ram_size must be defined");
+
+MEMORY {
+  boot_flash (rx) : ORIGIN = __boot_flash, LENGTH = __boot_flash_size
+  flash      (rx) : ORIGIN = __flash,      LENGTH = __flash_size
+  ram       (rwx) : ORIGIN = __ram,        LENGTH = __ram_size
+}
+
+SECTIONS {
+  PROVIDE(__stack = ORIGIN(ram) + LENGTH(ram));
+
+  .boot_flash : {
+    KEEP(*(.text.init.enter))
+    KEEP(*(.vectors))
+    KEEP(*(.vectors.*))
+    KEEP(*(.data.init.enter))
+  } > boot_flash
+
+  .text : ALIGN(8) {
+    KEEP(*(.text.startup .text.startup.*))
+    *(.text .text.* .gnu.linkonce.t.*)
+  } > flash
+
+  .preinit_array : ALIGN(8) {
+    KEEP(*(.preinit_array))
+    KEEP(*(.preinit_array.*))
+  } > flash
+
+  .init_array : ALIGN(8) {
+    KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
+    KEEP(*(.init_array))
+  } > flash
+
+  .fini_array : ALIGN(8) {
+    KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
+    KEEP(*(.fini_array))
+  } > flash
+
+  .rodata : ALIGN(8) {
+    *(.rodata .rodata.* .gnu.linkonce.r.*)
+    *(.srodata .srodata.*)
+    *(.rdata)
+  } > flash
+
+  .eh_frame_hdr : ALIGN(4) {
+    *(.eh_frame_hdr)
+    *(.eh_frame_entry .eh_frame_entry.*)
+  } > flash
+
+  .eh_frame : ALIGN(4) {
+    KEEP(*(.eh_frame))
+    KEEP(*(.eh_frame.*))
+  } > flash
+
+  .ARM.extab : ALIGN(4) {
+    *(.ARM.extab* .gnu.linkonce.armextab.*)
+  } > flash
+
+  .ARM.exidx : ALIGN(4) {
+    PROVIDE(__exidx_start = .);
+    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+    PROVIDE(__exidx_end = .);
+  } > flash
+
+  .data : ALIGN(8) {
+    PROVIDE(__data_start = .);
+    *(.data .data.* .gnu.linkonce.d.*)
+    *(.sdata .sdata.* .gnu.linkonce.s.*)
+    . = ALIGN(8);
+  } > ram AT> flash
+  PROVIDE(__data_source = LOADADDR(.data));
+
+  .tdata : ALIGN(8) {
+    PROVIDE(__tdata_start = .);
+    *(.tdata .tdata.* .gnu.linkonce.td.*)
+    . = ALIGN(8);
+    PROVIDE(__tdata_end = .);
+  } > ram AT> flash
+  PROVIDE(__tdata_source = LOADADDR(.tdata));
+  PROVIDE(__data_end = __tdata_end);
+  PROVIDE(__tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata));
+  PROVIDE(__data_source_end =
+              SIZEOF(.tdata) ? __tdata_source_end : LOADADDR(.data) + SIZEOF(.data));
+  PROVIDE(__edata = __data_end);
+  PROVIDE(_edata = __data_end);
+  PROVIDE(edata = __data_end);
+  PROVIDE(__data_size = __data_end - __data_start);
+  PROVIDE(__tdata_size = __tdata_end - __tdata_start);
+  PROVIDE(__data_source_size = __data_source_end - __data_source);
+
+  .tbss (NOLOAD) : ALIGN(8) {
+    PROVIDE(__tbss_start = .);
----------------
petrhosek wrote:

Many of these symbols are being defined and not being used anywhere, I'd prefer defining only the symbols that are actually used and adding additional ones later as needed to reduce the size (and complexity) of this script.

https://github.com/llvm/llvm-project/pull/207361


More information about the libc-commits mailing list