aboutsummaryrefslogtreecommitdiffstats
path: root/elf.py
diff options
context:
space:
mode:
Diffstat (limited to 'elf.py')
-rwxr-xr-xelf.py15
1 files changed, 9 insertions, 6 deletions
diff --git a/elf.py b/elf.py
index ae81253..a3379c5 100755
--- a/elf.py
+++ b/elf.py
@@ -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)