binman: Correct handling of zero bss size
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>
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
binman {
|
||||
u-boot-spl {
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -17,6 +17,7 @@ SECTIONS
|
||||
embed_start = .;
|
||||
*(.embed*)
|
||||
embed_end = .;
|
||||
region_size = 0;
|
||||
. = ALIGN(32);
|
||||
*(.data*)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user