]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
binman: Correct handling of zero bss size
authorSimon Glass <sjg@chromium.org>
Tue, 18 Jul 2023 13:24:01 +0000 (07:24 -0600)
committerSimon Glass <sjg@chromium.org>
Thu, 20 Jul 2023 20:10:58 +0000 (14:10 -0600)
Fix the check for the __bss_size symbol, since it may be 0. Unfortunately
there was no test coverage for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/binman/elf_test.py
tools/binman/etype/u_boot_spl_bss_pad.py
tools/binman/etype/u_boot_tpl_bss_pad.py
tools/binman/etype/u_boot_vpl_bss_pad.py
tools/binman/ftest.py
tools/binman/test/285_spl_expand.dts [new file with mode: 0644]
tools/binman/test/Makefile
tools/binman/test/bss_data_zero.c [new file with mode: 0644]
tools/binman/test/bss_data_zero.lds [new file with mode: 0644]
tools/binman/test/embed_data.lds

index 2fb3f6f28ff12c076e383846173a8278c75c892c..cc95b424b338d101fe0efeef4b13c9649b320606 100644 (file)
@@ -371,6 +371,11 @@ class TestElf(unittest.TestCase):
             elf.GetSymbolOffset(fname, 'embed')
         self.assertIn('__image_copy_start', str(e.exception))
 
+    def test_get_symbol_address(self):
+        fname = self.ElfTestFile('embed_data')
+        addr = elf.GetSymbolAddress(fname, 'region_size')
+        self.assertEqual(0, addr)
+
 
 if __name__ == '__main__':
     unittest.main()
index 1ffeb3911fd892b27f4d0e7ab78a0bb3d3c094fe..4af4045d3702ccd619a579a7cb0a10ec528ff3a7 100644 (file)
@@ -38,7 +38,7 @@ class Entry_u_boot_spl_bss_pad(Entry_blob):
     def ObtainContents(self):
         fname = tools.get_input_filename('spl/u-boot-spl')
         bss_size = elf.GetSymbolAddress(fname, '__bss_size')
-        if not bss_size:
+        if bss_size is None:
             self.Raise('Expected __bss_size symbol in spl/u-boot-spl')
         self.SetContents(tools.get_bytes(0, bss_size))
         return True
index 29c6a9541296e2fa69a4150de36931af4b4755d7..46d2cd58f7e273c37f2113dffa3aade76f9095ee 100644 (file)
@@ -38,7 +38,7 @@ class Entry_u_boot_tpl_bss_pad(Entry_blob):
     def ObtainContents(self):
         fname = tools.get_input_filename('tpl/u-boot-tpl')
         bss_size = elf.GetSymbolAddress(fname, '__bss_size')
-        if not bss_size:
+        if bss_size is None:
             self.Raise('Expected __bss_size symbol in tpl/u-boot-tpl')
         self.SetContents(tools.get_bytes(0, bss_size))
         return True
index bba38ccf9e93749f1f1faba6ca5a557128abeb70..12b286a71987e61dcc0eb5f7dc4ffb7208fff647 100644 (file)
@@ -38,7 +38,7 @@ class Entry_u_boot_vpl_bss_pad(Entry_blob):
     def ObtainContents(self):
         fname = tools.get_input_filename('vpl/u-boot-vpl')
         bss_size = elf.GetSymbolAddress(fname, '__bss_size')
-        if not bss_size:
+        if bss_size is None:
             self.Raise('Expected __bss_size symbol in vpl/u-boot-vpl')
         self.SetContents(tools.get_bytes(0, bss_size))
         return True
index ed1940ed9f71b4864860869c84dbfc7e7102232e..dc9a95d341e5aff4e08d15b80fcc8b86da02e0d2 100644 (file)
@@ -6773,6 +6773,18 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         self.assertEqual(U_BOOT_NODTB_DATA, data[-len(U_BOOT_NODTB_DATA):])
         fit_data = data[len(U_BOOT_DATA):-len(U_BOOT_NODTB_DATA)]
 
+    def testSplEmptyBss(self):
+        """Test an expanded SPL with a zero-size BSS"""
+        # ELF file with a '__bss_size' symbol
+        self._SetupSplElf(src_fname='bss_data_zero')
+
+        entry_args = {
+            'spl-bss-pad': 'y',
+            'spl-dtb': 'y',
+        }
+        data = self._DoReadFileDtb('285_spl_expand.dts',
+                                   use_expanded=True, entry_args=entry_args)[0]
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tools/binman/test/285_spl_expand.dts b/tools/binman/test/285_spl_expand.dts
new file mode 100644 (file)
index 0000000..9c88ccb
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               u-boot-spl {
+               };
+       };
+};
index cd66a3038be2e9c7febf30b607ce4cf1448c4d53..4d152eee9c09eececc70309ea25aa48393d8438a 100644 (file)
@@ -32,7 +32,7 @@ LDS_BINMAN_EMBED := -T $(SRC)u_boot_binman_embed.lds
 LDS_EFL_SECTIONS := -T $(SRC)elf_sections.lds
 LDS_BLOB := -T $(SRC)blob_syms.lds
 
-TARGETS = u_boot_ucode_ptr u_boot_no_ucode_ptr bss_data \
+TARGETS = u_boot_ucode_ptr u_boot_no_ucode_ptr bss_data bss_data_zero \
        u_boot_binman_syms u_boot_binman_syms.bin u_boot_binman_syms_bad \
        u_boot_binman_syms_size u_boot_binman_syms_x86 embed_data \
        u_boot_binman_embed u_boot_binman_embed_sm elf_sections blob_syms.bin
@@ -48,6 +48,9 @@ u_boot_ucode_ptr: u_boot_ucode_ptr.c
 bss_data: CFLAGS += $(SRC)bss_data.lds
 bss_data: bss_data.c
 
+bss_data_zero: CFLAGS += $(SRC)bss_data_zero.lds
+bss_data_zero: bss_data_zero.c
+
 embed_data: CFLAGS += $(SRC)embed_data.lds
 embed_data: embed_data.c
 
diff --git a/tools/binman/test/bss_data_zero.c b/tools/binman/test/bss_data_zero.c
new file mode 100644 (file)
index 0000000..7047a3b
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2016 Google, Inc
+ *
+ * Simple program to create a bss_data region so the symbol can be read
+ * by binutils. This is used by binman tests.
+ */
+
+int bss_data[10];
+
+int main(void)
+{
+       bss_data[2] = 2;
+
+       return 0;
+}
diff --git a/tools/binman/test/bss_data_zero.lds b/tools/binman/test/bss_data_zero.lds
new file mode 100644 (file)
index 0000000..8fa0210
--- /dev/null
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (c) 2016 Google, Inc
+ */
+
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+       . = 0xfffffdf0;
+       _start = .;
+       __bss_size = 0;
+}
index 908bf66c294b5b32dd8ef51f3a1039f3ad7be0cd..d416cb2111076802623b2103bc83000397aff9c4 100644 (file)
@@ -17,6 +17,7 @@ SECTIONS
                embed_start = .;
                *(.embed*)
                embed_end = .;
+               region_size = 0;
                . = ALIGN(32);
                *(.data*)
        }