Hi, > We want to support moving the stub stections around in case the section
Typo, it needs to read 'sections' not 'stections'. > headers grow into them in the output file. To prepare for that, change > the we the unified image is created: Use the section objects to obtain No proper sentence: '[...] the we the [...]'. > size and specifically file position during image creation. That makes it > easier to move the data around while new sections are being added and > later - when writing out - refer to the right offsets. > > Signed-off-by: Jan Kiszka <[email protected]> > --- > tools/bg_gen_unified_kernel | 75 +++++++++++++++++++------------------ > 1 file changed, 39 insertions(+), 36 deletions(-) > > diff --git a/tools/bg_gen_unified_kernel b/tools/bg_gen_unified_kernel > index 45d9cbc..2dc0bcd 100755 > --- a/tools/bg_gen_unified_kernel > +++ b/tools/bg_gen_unified_kernel > @@ -204,57 +204,57 @@ def main(): > stub = args.stub.read() > > pe_headers = PEHeaders('stub image', stub) > + stub_first_data = pe_headers.first_data > file_align = pe_headers.get_file_alignment() > > # Add extra section headers > - cmdline_offs = align(len(stub), file_align) > - cmdline_size = align(len(cmdline), file_align) > - section = Section(b'.cmdline', cmdline_size, 0x30000, > - cmdline_size, cmdline_offs, > - Section.IMAGE_SCN_CNT_INITIALIZED_DATA | > - Section.IMAGE_SCN_MEM_READ) > - pe_headers.add_section(section) > + current_offs = align(len(stub), file_align) > + sect_size = align(len(cmdline), file_align) > + cmdline_section = Section(b'.cmdline', sect_size, 0x30000, > + sect_size, current_offs, > + Section.IMAGE_SCN_CNT_INITIALIZED_DATA | > + Section.IMAGE_SCN_MEM_READ) > + pe_headers.add_section(cmdline_section) > > kernel = args.kernel.read() > kernel_pe_headers = PEHeaders('kernel', kernel) > > - kernel_offs = cmdline_offs + cmdline_size > - kernel_size = align(len(kernel), file_align) > - kernel_virt_size = max(kernel_size, > kernel_pe_headers.get_size_of_image()) > - section = Section(b'.kernel', kernel_virt_size, 0x2000000, > - kernel_size, kernel_offs, > - Section.IMAGE_SCN_CNT_INITIALIZED_DATA | > - Section.IMAGE_SCN_MEM_READ) > - pe_headers.add_section(section) > + current_offs = cmdline_section.data_offs + cmdline_section.data_size > + sect_size = align(len(kernel), file_align) > + virt_size = max(sect_size, kernel_pe_headers.get_size_of_image()) > + kernel_section = Section(b'.kernel', virt_size, 0x2000000, > + sect_size, current_offs, > + Section.IMAGE_SCN_CNT_INITIALIZED_DATA | > + Section.IMAGE_SCN_MEM_READ) > + pe_headers.add_section(kernel_section) > > pe_headers.set_section_alignment(kernel_pe_headers.get_section_alignment()) > > - initrd_offs = kernel_offs + kernel_size > - initrd_size = 0 > + current_offs = kernel_section.data_offs + kernel_section.data_size > if args.initrd: > initrd = args.initrd.read() > - initrd_size = align(len(initrd), file_align) > - section = Section(b'.initrd', initrd_size, 0x6000000, > - initrd_size, initrd_offs, > - Section.IMAGE_SCN_CNT_INITIALIZED_DATA | > - Section.IMAGE_SCN_MEM_READ) > - pe_headers.add_section(section) > + sect_size = align(len(initrd), file_align) > + initrd_section = Section(b'.initrd', sect_size, 0x6000000, > + sect_size, current_offs, > + Section.IMAGE_SCN_CNT_INITIALIZED_DATA | > + Section.IMAGE_SCN_MEM_READ) > + pe_headers.add_section(initrd_section) > + current_offs = initrd_section.data_offs + initrd_section.data_size > > - current_offs = initrd_offs + initrd_size > dtb_virt = 0x40000 > dtb = [] > - dtb_offs = [] > - dtb_size = 0 > + dtb_section = [] > for n in range(len(args.dtb)): > dtb.append(args.dtb[n].read()) > - dtb_offs.append(current_offs) > - dtb_size = align(len(dtb[n]), file_align) > + sect_size = align(len(dtb[n]), file_align) > section = Section(bytes('.dtb-{}'.format(n + 1), 'ascii'), > - dtb_size, dtb_virt, dtb_size, dtb_offs[n], > + sect_size, dtb_virt, sect_size, current_offs, > Section.IMAGE_SCN_CNT_INITIALIZED_DATA | > Section.IMAGE_SCN_MEM_READ) > pe_headers.add_section(section) > - dtb_virt += dtb_size > - current_offs += dtb_size > + dtb_section.append(section) > + > + dtb_virt += section.data_size > + current_offs = section.data_offs + section.data_size > > # Build unified image header > image = pe_headers.dos_header + pe_headers.coff_header + \ > @@ -262,22 +262,25 @@ def main(): > for section in pe_headers.sections: > image += section.get_struct() > > + # Pad till first section data > + image += bytearray(pe_headers.first_data - len(image)) > + > # Write remaining stub > - image += stub[len(image):] > + image += stub[stub_first_data:] > > # Write data of extra sections > - image += bytearray(cmdline_offs - len(image)) > + image += bytearray(cmdline_section.data_offs - len(image)) > image += cmdline > > - image += bytearray(kernel_offs - len(image)) > + image += bytearray(kernel_section.data_offs - len(image)) > image += kernel > > if args.initrd: > - image += bytearray(initrd_offs - len(image)) > + image += bytearray(initrd_section.data_offs - len(image)) > image += initrd > > for n in range(len(dtb)): > - image += bytearray(dtb_offs[n] - len(image)) > + image += bytearray(dtb_section[n].data_offs - len(image)) > image += dtb[n] > > # Align to promised size of last section > -- > 2.35.3 > Kind regards, Christian -- Dr. Christian Storm Siemens AG, Technology, T CED SES-DE Otto-Hahn-Ring 6, 81739 München, Germany -- You received this message because you are subscribed to the Google Groups "EFI Boot Guard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/efibootguard-dev/20220701135854.u2rxafb4fh6oehul%40MD1ZFJVC.ad001.siemens.net.
