diff options
Diffstat (limited to 'elf.py')
| -rwxr-xr-x | elf.py | 15 |
1 files changed, 9 insertions, 6 deletions
@@ -29,7 +29,7 @@ def wi(num, size=2): def padto(offset, cursor): missing = offset - cursor if missing < 0: - raise ValueError("already past offset!") + raise ValueError("cursor {} already past offset {}!".format(cursor, offset)) w(b'\x00' * missing) return offset @@ -57,12 +57,13 @@ def write_elf_header(segments): c += wi(0x0) # e_shstrndx return c -def write_program_header(segment, c): +def write_program_header(segment, c, start): align = 0x1000 - offset = (1 + c // align) * align + offset = (1 + start // align) * align + segment['offset'] = offset start = segment['addr'] size = len(segment['content']) - segment['offset'] = offset + flags = 5 if segment['name'] == "code" else 6 if offset % align != start % align: print("{:02x} {:02x}".format(offset, offset % align)) @@ -75,7 +76,7 @@ def write_program_header(segment, c): c += wi(start, 4) # p_paddr c += wi(size, 4) # p_filesz c += wi(size, 4) # p_memsz - c += wi(0x5, 4) # p_flags, 0x5=rx, 0x6=rw + c += wi(flags, 4) # p_flags, 0x5=rx, 0x6=rw c += wi(align, 4) # p_align return c @@ -100,8 +101,10 @@ if __name__ == "__main__": cursor = 0 c = write_elf_header(segments) + segment_start = 0x1000 for seg in segments: - c = write_program_header(seg, c) + c = write_program_header(seg, c, segment_start) + segment_start = seg['offset'] + len(seg['content']) for seg in segments: c = padto(seg['offset'], c) |
