def get_value(ftype, value): """Get a value as a C expression For integers this returns a byte-swapped (little-endian) hex string For bytes this returns a hex string, e.g. 0x12 For strings this returns a literal string enclosed in quotes For booleans this return 'true' Args: type: Data type (fdt_util) value: Data value, as a string of bytes """ if ftype == fdt.TYPE_INT: return '%#x' % fdt_util.fdt32_to_cpu(value) elif ftype == fdt.TYPE_BYTE: return '%#x' % tools.ToByte(value[0]) elif ftype == fdt.TYPE_STRING: return '"%s"' % value elif ftype == fdt.TYPE_BOOL: return 'true' elif ftype == fdt.TYPE_INT64: return '%#x' % value
def get_value(ftype, value): """Get a value as a C expression For integers this returns a byte-swapped (little-endian) hex string For bytes this returns a hex string, e.g. 0x12 For strings this returns a literal string enclosed in quotes For booleans this return 'true' Args: type: Data type (fdt_util) value: Data value, as a string of bytes """ if ftype == fdt.TYPE_INT: return '%#x' % fdt_util.fdt32_to_cpu(value) elif ftype == fdt.TYPE_BYTE: return '%#x' % tools.ToByte(value[0]) elif ftype == fdt.TYPE_STRING: # Handle evil ACPI backslashes by adding another backslash before them. # So "\\_SB.GPO0" in the device tree effectively stays like that in C return '"%s"' % value.replace('\\', '\\\\') elif ftype == fdt.TYPE_BOOL: return 'true' elif ftype == fdt.TYPE_INT64: return '%#x' % value
def MakeElf(elf_fname, text, data): """Make an elf file with the given data in a single section The output file has a several section including '.text' and '.data', containing the info provided in arguments. Args: elf_fname: Output filename text: Text (code) to put in the file's .text section data: Data to put in the file's .data section """ outdir = tempfile.mkdtemp(prefix='binman.elf.') s_file = os.path.join(outdir, 'elf.S') # Spilt the text into two parts so that we can make the entry point two # bytes after the start of the text section text_bytes1 = ['\t.byte\t%#x' % tools.ToByte(byte) for byte in text[:2]] text_bytes2 = ['\t.byte\t%#x' % tools.ToByte(byte) for byte in text[2:]] data_bytes = ['\t.byte\t%#x' % tools.ToByte(byte) for byte in data] with open(s_file, 'w') as fd: print( '''/* Auto-generated C program to produce an ELF file for testing */ .section .text .code32 .globl _start .type _start, @function %s _start: %s .ident "comment" .comm fred,8,4 .section .empty .globl _empty _empty: .byte 1 .globl ernie .data .type ernie, @object .size ernie, 4 ernie: %s ''' % ('\n'.join(text_bytes1), '\n'.join(text_bytes2), '\n'.join(data_bytes)), file=fd) lds_file = os.path.join(outdir, 'elf.lds') # Use a linker script to set the alignment and text address. with open(lds_file, 'w') as fd: print( '''/* Auto-generated linker script to produce an ELF file for testing */ PHDRS { text PT_LOAD ; data PT_LOAD ; empty PT_LOAD FLAGS ( 6 ) ; note PT_NOTE ; } SECTIONS { . = 0xfef20000; ENTRY(_start) .text . : SUBALIGN(0) { *(.text) } :text .data : { *(.data) } :data _bss_start = .; .empty : { *(.empty) } :empty /DISCARD/ : { *(.note.gnu.property) } .note : { *(.comment) } :note .bss _bss_start (OVERLAY) : { *(.bss) } } ''', file=fd) # -static: Avoid requiring any shared libraries # -nostdlib: Don't link with C library # -Wl,--build-id=none: Don't generate a build ID, so that we just get the # text section at the start # -m32: Build for 32-bit x86 # -T...: Specifies the link script, which sets the start address cc, args = tools.GetTargetCompileTool('cc') args += [ '-static', '-nostdlib', '-Wl,--build-id=none', '-m32', '-T', lds_file, '-o', elf_fname, s_file ] stdout = command.Output(cc, *args) shutil.rmtree(outdir)