diff options
Diffstat (limited to 'elf.py')
| -rwxr-xr-x | elf.py | 25 |
1 files changed, 16 insertions, 9 deletions
@@ -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)) |
