aboutsummaryrefslogtreecommitdiffstats
path: root/elf.py
diff options
context:
space:
mode:
Diffstat (limited to 'elf.py')
-rwxr-xr-xelf.py25
1 files changed, 16 insertions, 9 deletions
diff --git a/elf.py b/elf.py
index 62ba46d..8b7c6a7 100755
--- a/elf.py
+++ b/elf.py
@@ -191,27 +191,34 @@ def elf(iter):
out = ELF(
e_class=ELFCLASS.ELFCLASS32,
e_data=ELFDATA.ELFDATA2LSB,
- e_type=ET.ET_EXEC,
+ e_type=ET.ET_REL,
e_machine=EM(0xF3),
)
out.Elf.Ehdr.e_entry = next(s for s in segments if s["name"] == "code")["addr"]
- out.Elf.Ehdr.e_flags = 4
out.Elf.Phdr_table.clear()
- seg_ids = {}
+ sec_ids = {}
for seg in segments:
- flags = "rx" if seg["name"] == "code" else "rw"
name = SECTION_NAMES[seg["name"]]
- id = out._append_section(name, seg["content"], seg["addr"], sh_addralign=0x1000)
- out.append_segment(id, flags=flags)
- seg_ids[seg["name"]] = id
+ sec_flags = SHF.SHF_ALLOC
+ seg_flags = "w"
+ if seg["name"] == "code":
+ sec_flags |= SHF.SHF_EXECINSTR
+ seg_flags += "x"
+ else:
+ sec_flags |= SHF.SHF_WRITE
+ seg_flags += "w"
+
+ id = out._append_section(name, seg["content"], seg["addr"], sh_addralign=4, sh_flags=sec_flags)
+ # out.append_segment(id, flags=seg_flags)
+ sec_ids[seg["name"]] = id
for label in labels:
- sect_id = seg_ids[label["segment"]]
+ sect_id = sec_ids[label["segment"]]
out.append_symbol(
- label["name"], sect_id, label["offset"], 4, sym_type=STT.STT_FUNC
+ label["name"], sect_id, label["offset"], 4, sym_type=STT.STT_FUNC, sym_binding=STB.STB_GLOBAL
)
sys.stdout.buffer.write(bytes(out))