[Wisp-cvs] wisp/users/dig .cvsignore,1.2,1.3 elf.py,1.10,1.11 linkie.py,1.10,1.11 makehello.py,1.8,1
Status: Alpha
Brought to you by:
digg
From: <di...@us...> - 2003-02-16 10:48:20
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv15102 Modified Files: .cvsignore elf.py linkie.py makehello.py Log Message: first working ELF32 executable (static linkage, no symbols, no relocation) generated Index: .cvsignore =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/.cvsignore,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- .cvsignore 6 Feb 2003 20:11:39 -0000 1.2 +++ .cvsignore 16 Feb 2003 10:48:17 -0000 1.3 @@ -2,3 +2,4 @@ *.pyo Makefile Makefile.in +hello Index: elf.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/elf.py,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- elf.py 15 Feb 2003 22:17:16 -0000 1.10 +++ elf.py 16 Feb 2003 10:48:17 -0000 1.11 @@ -351,18 +351,19 @@ h.emit_wyde_sum(['elf/shstrndx']) return h -def make_ELF32_pheader (byte_order, name): - h = Linkie(byte_order) - h.align(4) - h.emit_tetra_sum([name + '/p_type']) - h.emit_tetra_sum([name + '/offset']) - h.emit_tetra_sum([name]) # p_vaddr - h.emit_tetra_sum([name]) # p_paddr - h.emit_tetra_sum([name + '/filesz']) - h.emit_tetra_sum([name + '/memsz']) - h.emit_tetra_sum([name + '/p_flags']) - h.emit_tetra_sum([name + '/alignment']) - return h +def make_ELF32_phtable (byte_order, names): + t = Linkie(byte_order) + t.align(4) + for name in names: + t.emit_tetra_sum([name + '/p_type']) + t.emit_tetra_sum([name + '/offset']) + t.emit_tetra_sum([name]) # p_vaddr + t.emit_tetra_sum([name]) # p_paddr + t.emit_tetra_sum([name + '/filesz']) + t.emit_tetra_sum([name + '/memsz']) + t.emit_tetra_sum([name + '/p_flags']) + t.emit_tetra_sum([name + '/p_align']) + return t def make_ELF32_shtable (byte_order, names): t = Linkie(byte_order) @@ -377,7 +378,7 @@ t.emit_tetra_sum([name + '/sh_size']) t.emit_tetra_sum([name + '/sh_link']) t.emit_tetra_sum([name + '/sh_info']) - t.emit_tetra_sum([name + '/alignment']) + t.emit_tetra_sum([name + '/sh_align']) t.emit_tetra_sum([name + '/sh_entsize']) return t Index: linkie.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/linkie.py,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- linkie.py 15 Feb 2003 22:17:16 -0000 1.10 +++ linkie.py 16 Feb 2003 10:48:17 -0000 1.11 @@ -1,6 +1,6 @@ #### linkie.py - a Python module for low-level linkable objects # -# Copyleft © 2002 by Andres Soolo (di...@us...) +# Copyleft © 2003 by Andres Soolo (di...@us...) # This file is licensed under the GNU GPL v2. If you # don't know what that means, please do read the GPL. # Index: makehello.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/makehello.py,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- makehello.py 15 Feb 2003 22:17:16 -0000 1.8 +++ makehello.py 16 Feb 2003 10:48:17 -0000 1.9 @@ -1,6 +1,6 @@ #### makehello.py - test linkie.py by creating a greeter # -# Copyleft © 2002 by Andres Soolo (di...@us...) +# Copyleft © 2003 by Andres Soolo (di...@us...) # This file is licensed under the GNU GPL v2. If you # don't know what that means, please do read the GPL. # @@ -91,34 +91,56 @@ symbols['elf/type'] = ET.EXEC symbols['elf/machine'] = EM.I386 symbols['elf/flags'] = 0 # no flags for ia386 -program_header_table = make_ELF32_pheader('<', '.text') + \ - make_ELF32_pheader('<', '.data') +program_header_table = make_ELF32_phtable('<', ['.text', '.data']) symbols['elf/phoff'] = hello.extend(program_header_table) symbols['elf/phnum'] = 2 -# process the segments + for name, section in (('.text', code), ('.data', data), ('.shstr', shstr)): + p_flags = guess_pflags(name) alignment = section.get_alignment() - symbols[name + '/alignment'] = alignment - hello.align(min(alignment, 0x1000)) + symbols[name + '/sh_align'] = alignment + + if p_flags <> 0: + symbols[name + '/p_align'] = 0x1000 + hello.align(min(alignment, 0x1000)) + else: + # No program header entry => not loaded + # thusly no larger alignment necessary. + hello.align(min(alignment, 4)) + + hello.place_symbol(name) offset = hello.filesz() - address = memory_boundary | (offset & 0xFFF) - # take into account alignments larger than a page - address = (address + alignment - 1) & ~(alignment - 1) - symbols[name] = address + + if p_flags <> 0: + address = memory_boundary | (offset & 0xFFF) + # take into account alignments larger than a page + address = (address + alignment - 1) & ~(alignment - 1) + symbols[name + '/p_flags'] = guess_pflags(name) + symbols[name + '/p_type'] = guess_ptype(name) + symbols[name] = address + else: + address = None + symbols[name] = 0 + symbols[name + '/offset'] = offset symbols[name + '/memsz'] = section.memsz() symbols[name + '/filesz'] = section.filesz() symbols[name + '/sh_size'] = section.filesz() symbols[name + '/sh_type'] = guess_shtype(name) symbols[name + '/sh_info'] = 0 + symbols[name + '/sh_link'] = SHN.UNDEF + symbols[name + '/sh_entsize'] = 0 symbols[name + '/sh_flags'] = guess_shflags(name) - symbols[name + '/p_flags'] = guess_pflags(name) - symbols[name + '/p_type'] = guess_ptype(name) - data = section.get_file() - hello.from_array(data) + + hello.from_array(section.get_file()) + if address <> None: + for symbol, value in section.get_symbols(): + symbols[symbol] = address + value + print '%s = %08x' % (symbol, address + value) for symbol, value in section.get_symbols(): - symbols[symbol] = address + value hello.place_symbol(symbol, offset + value) # for dump to work nicely + for loc, typ, arg in section.get_notes(): + hello.notify_linker(offset + loc, typ, arg) memory_boundary += section.memsz() memory_boundary = (memory_boundary + 0xFFF) & ~0xFFF @@ -127,5 +149,9 @@ symbols['elf/shoff'] = hello.extend(section_header_table) symbols['elf/shnum'] = 4 symbols['elf/shstrndx'] = 3 -hello.link(symbols) hello.dump() +hello.link(symbols) + +f = open('hello', 'w') +hello.get_file().tofile(f) +f.close() |