From 2f32e1ffc75ca54d1fe405a1b77868ea810e503d Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Fri, 5 Jun 2020 19:55:34 +0300 Subject: [PATCH 1/4] elf2bin: clean-up after objcopy, use kwargs interfaces --- tools/elf2bin.py | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/tools/elf2bin.py b/tools/elf2bin.py index 9c4a1b2ce1..de27433da8 100755 --- a/tools/elf2bin.py +++ b/tools/elf2bin.py @@ -54,29 +54,28 @@ def get_segment_size_addr(elf, segment, path): return [ size, addr ] raise Exception('Unable to find size and start point in file "' + elf + '" for "' + segment + '"') -def read_segment(elf, segment, path): - tmpfile, dumpfile = tempfile.mkstemp() - os.close(tmpfile) +def read_segment(elf, tmpdir, segment, path): + dumpfile = os.path.join(tmpdir, "read_segment") p = subprocess.check_call([path + "/xtensa-lx106-elf-objcopy", '-O', 'binary', '--only-section=' + segment, elf, dumpfile], stdout=subprocess.PIPE) - binfile = open(dumpfile, "rb") - raw = binfile.read() - binfile.close() + with open(dumpfile, "rb") as binfile: + raw = binfile.read() + return raw -def write_bin(out, elf, segments, to_addr, flash_mode, flash_size, flash_freq, path): - entry = int(get_elf_entry( elf, path )) - header = [ 0xe9, len(segments), fmodeb[flash_mode], ffreqb[flash_freq] + 16 * fsizeb[flash_size], +def write_bin(*, out, tmpdir, args, elf, segments, to_addr): + entry = int(get_elf_entry( elf, args.path )) + header = [ 0xe9, len(segments), fmodeb[args.flash_mode], ffreqb[args.flash_freq] + 16 * fsizeb[args.flash_size], entry & 255, (entry>>8) & 255, (entry>>16) & 255, (entry>>24) & 255 ] out.write(bytearray(header)) total_size = 8 checksum = 0xef for segment in segments: - [size, addr] = get_segment_size_addr(elf, segment, path) + [size, addr] = get_segment_size_addr(elf, segment, args.path) seghdr = [ addr & 255, (addr>>8) & 255, (addr>>16) & 255, (addr>>24) & 255, size & 255, (size>>8) & 255, (size>>16) & 255, (size>>24) & 255] out.write(bytearray(seghdr)); total_size += 8; - raw = read_segment(elf, segment, path) + raw = read_segment(elf, tmpdir, segment, args.path) if len(raw) != size: raise Exception('Segment size doesn\'t match read data for "' + segment + '" in "' + elf + '"') out.write(raw) @@ -152,12 +151,24 @@ def main(): args = parser.parse_args() - print('Creating BIN file "' + args.out + '" using "' + args.app + '"') + print('Creating BIN file "{out}" using "{eboot}" and "{app}"'.format( + out=args.out, eboot=args.eboot, app=args.app)) + + with tempfile.TemporaryDirectory() as tmpdir, open(args.out, "wb") as out: + def wrapper(**kwargs): + write_bin(out=out, tmpdir=tmpdir, args=args, **kwargs) + + wrapper( + elf=args.eboot, + segments=[".text"], + to_addr=4096 + ) - out = open(args.out, "wb") - write_bin(out, args.eboot, ['.text'], 4096, args.flash_mode, args.flash_size, args.flash_freq, args.path) - write_bin(out, args.app, ['.irom0.text', '.text', '.text1', '.data', '.rodata'], 0, args.flash_mode, args.flash_size, args.flash_freq, args.path) - out.close() + wrapper( + elf=args.app, + segments=[".irom0.text", ".text", ".text1", ".data", ".rodata"], + to_addr=0, + ) # Because the CRC includes both eboot and app, can only calculate it after the entire BIN generated add_crc(args.out) From b69d18394503af2e25b0f7caaa23db9ce735b1f2 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Fri, 5 Jun 2020 20:27:49 +0300 Subject: [PATCH 2/4] unique names for segments --- tools/elf2bin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/elf2bin.py b/tools/elf2bin.py index de27433da8..ad884e2dcd 100755 --- a/tools/elf2bin.py +++ b/tools/elf2bin.py @@ -55,7 +55,7 @@ def get_segment_size_addr(elf, segment, path): raise Exception('Unable to find size and start point in file "' + elf + '" for "' + segment + '"') def read_segment(elf, tmpdir, segment, path): - dumpfile = os.path.join(tmpdir, "read_segment") + dumpfile = os.path.join(tmpdir, segment + '.read_segment') p = subprocess.check_call([path + "/xtensa-lx106-elf-objcopy", '-O', 'binary', '--only-section=' + segment, elf, dumpfile], stdout=subprocess.PIPE) with open(dumpfile, "rb") as binfile: raw = binfile.read() From 3f85228f9e2764d458aac9cf7fb75ea91551d547 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Fri, 5 Jun 2020 20:33:17 +0300 Subject: [PATCH 3/4] names --- tools/elf2bin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/elf2bin.py b/tools/elf2bin.py index ad884e2dcd..c4eca6ca9b 100755 --- a/tools/elf2bin.py +++ b/tools/elf2bin.py @@ -55,10 +55,10 @@ def get_segment_size_addr(elf, segment, path): raise Exception('Unable to find size and start point in file "' + elf + '" for "' + segment + '"') def read_segment(elf, tmpdir, segment, path): - dumpfile = os.path.join(tmpdir, segment + '.read_segment') - p = subprocess.check_call([path + "/xtensa-lx106-elf-objcopy", '-O', 'binary', '--only-section=' + segment, elf, dumpfile], stdout=subprocess.PIPE) - with open(dumpfile, "rb") as binfile: - raw = binfile.read() + tmpfile = os.path.join(tmpdir, segment + '.read_segment') + p = subprocess.check_call([path + "/xtensa-lx106-elf-objcopy", '-O', 'binary', '--only-section=' + segment, elf, tmpfile], stdout=subprocess.PIPE) + with open(tmpfile, "rb") as f: + raw = f.read() return raw From af2d1f2bf35f16e8339a6aeec4ae3d7159558668 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Sat, 6 Jun 2020 23:22:21 +0300 Subject: [PATCH 4/4] run with python2, just os.remove file after use --- tools/elf2bin.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tools/elf2bin.py b/tools/elf2bin.py index c4eca6ca9b..4fc407b908 100755 --- a/tools/elf2bin.py +++ b/tools/elf2bin.py @@ -54,15 +54,17 @@ def get_segment_size_addr(elf, segment, path): return [ size, addr ] raise Exception('Unable to find size and start point in file "' + elf + '" for "' + segment + '"') -def read_segment(elf, tmpdir, segment, path): - tmpfile = os.path.join(tmpdir, segment + '.read_segment') +def read_segment(elf, segment, path): + fd, tmpfile = tempfile.mkstemp() + os.close(fd) p = subprocess.check_call([path + "/xtensa-lx106-elf-objcopy", '-O', 'binary', '--only-section=' + segment, elf, tmpfile], stdout=subprocess.PIPE) with open(tmpfile, "rb") as f: raw = f.read() + os.remove(tmpfile) return raw -def write_bin(*, out, tmpdir, args, elf, segments, to_addr): +def write_bin(out, args, elf, segments, to_addr): entry = int(get_elf_entry( elf, args.path )) header = [ 0xe9, len(segments), fmodeb[args.flash_mode], ffreqb[args.flash_freq] + 16 * fsizeb[args.flash_size], entry & 255, (entry>>8) & 255, (entry>>16) & 255, (entry>>24) & 255 ] @@ -75,7 +77,7 @@ def write_bin(*, out, tmpdir, args, elf, segments, to_addr): size & 255, (size>>8) & 255, (size>>16) & 255, (size>>24) & 255] out.write(bytearray(seghdr)); total_size += 8; - raw = read_segment(elf, tmpdir, segment, args.path) + raw = read_segment(elf, segment, args.path) if len(raw) != size: raise Exception('Segment size doesn\'t match read data for "' + segment + '" in "' + elf + '"') out.write(raw) @@ -154,9 +156,9 @@ def main(): print('Creating BIN file "{out}" using "{eboot}" and "{app}"'.format( out=args.out, eboot=args.eboot, app=args.app)) - with tempfile.TemporaryDirectory() as tmpdir, open(args.out, "wb") as out: + with open(args.out, "wb") as out: def wrapper(**kwargs): - write_bin(out=out, tmpdir=tmpdir, args=args, **kwargs) + write_bin(out=out, args=args, **kwargs) wrapper( elf=args.eboot, @@ -167,7 +169,7 @@ def wrapper(**kwargs): wrapper( elf=args.app, segments=[".irom0.text", ".text", ".text1", ".data", ".rodata"], - to_addr=0, + to_addr=0 ) # Because the CRC includes both eboot and app, can only calculate it after the entire BIN generated