Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 292 → Rev 293

/SPARTAN/trunk/tools/genmap.py
4,63 → 4,61
import struct
import re
 
symline = re.compile(r'(0x[a-f0-9]+)\s+([^\s]+)$')
fileline = re.compile(r'[^\s]+\s+0x[a-f0-9]+\s+0x[a-f0-9]+\s+([^\s]+\.o)$')
 
MAXSTRING=63
symtabfmt = "<Q%ds" % (MAXSTRING+1)
 
def read_symbols(inp):
while 1:
line = inp.readline()
if not line:
return
if 'memory map' in line:
break
 
symtable = {}
filename = ''
while 1:
line = inp.readline()
if not line.strip():
continue
if line[0] not in (' ','.'):
break
objline = re.compile(r'([0-9a-f]+)\s+[lg]\s+F\s+\.text\s+[0-9a-f]+\s+(.*)$')
fileexp = re.compile(r'([^\s]+):\s+file format')
def read_obdump(inp):
result = {}
fname = ''
for line in inp:
line = line.strip()
# Search for file name
res = fileline.match(line)
res = objline.match(line)
if res:
filename = res.group(1)
# Search for symbols
res = symline.match(line)
result.setdefault(fname,[]).append((int(res.group(1),16),
res.group(2)))
res = fileexp.match(line)
if res:
symtable[int(res.group(1),16)] = filename + ':' + res.group(2)
return symtable
fname = res.group(1)
continue
def generate(inp, out):
symtab = read_symbols(inp)
if not symtab:
print "Bad kernel.map format, empty."
sys.exit(1)
addrs = symtab.keys()
addrs.sort()
for addr in addrs:
# Do not write address 0, it indicates end of data
if addr == 0:
continue
data = struct.pack(symtabfmt,addr,symtab[addr][:MAXSTRING])
out.write(data)
return result
 
startfile = re.compile(r'\.text\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$')
def generate(kmapf, obmapf, out):
obdump = read_obdump(obmapf)
 
def sorter(x,y):
return cmp(x[0],y[0])
 
for line in kmapf:
line = line.strip()
res = startfile.match(line)
if res and obdump.has_key(res.group(2)):
offset = int(res.group(1),16)
fname = res.group(2)
symbols = obdump[fname]
symbols.sort(sorter)
for addr,symbol in symbols:
value = fname + ':' + symbol
data = struct.pack(symtabfmt,addr+offset,value[:MAXSTRING])
out.write(data)
out.write(struct.pack(symtabfmt,0,''))
 
def main():
if len(sys.argv) != 3:
print "Usage: %s <kernel.map> <output.bin>" % sys.argv[0]
if len(sys.argv) != 4:
print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0]
sys.exit(1)
 
inp = open(sys.argv[1],'r')
out = open(sys.argv[2],'w')
generate(inp,out)
inp.close()
kmapf = open(sys.argv[1],'r')
obmapf = open(sys.argv[2],'r')
out = open(sys.argv[3],'w')
generate(kmapf,obmapf,out)
kmapf.close()
obmapf.close()
out.close()
 
if __name__ == '__main__':
/SPARTAN/trunk/src/Makefile
65,7 → 65,7
 
clean:
find . ../arch/$(ARCH)/src ../test -name '*.o' -exec rm \{\} \;
-rm *.bin kernel.map kernel.map.pre debug/real_map.bin
-rm *.bin kernel.map kernel.map.pre kernel.objdump debug/real_map.bin
$(MAKE) -C ../arch/$(ARCH)/boot clean
 
dist-clean:
73,11 → 73,17
-rm Makefile.depend
-$(MAKE) clean
 
kernel.bin: $(arch_objects) $(objects) $(test_objects) ../arch/$(ARCH)/_link.ld
debug/real_map.bin: $(arch_objects) $(objects) $(test_objects) ../arch/$(ARCH)/_link.ld
$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) --prefix-sections=symtab Makefile debug/empty_map.o
$(LD) -T ../arch/$(ARCH)/_link.ld $(LFLAGS) $(arch_objects) $(objects) $(test_objects) debug/empty_map.o -o $@ -Map kernel.map.pre
../tools/genmap.py kernel.map.pre debug/real_map.bin
$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) --prefix-sections=symtab debug/real_map.bin debug/real_map.o
$(OBJDUMP) -t $(arch_objects) $(objects) $(test_objects) > kernel.objdump
../tools/genmap.py kernel.map.pre kernel.objdump debug/real_map.bin
 
debug/real_map.o: debug/real_map.bin
$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) --prefix-sections=symtab $< $@
 
 
kernel.bin: $(arch_objects) $(objects) $(test_objects) ../arch/$(ARCH)/_link.ld debug/real_map.o
$(LD) -T ../arch/$(ARCH)/_link.ld $(LFLAGS) $(arch_objects) $(objects) $(test_objects) debug/real_map.o -o $@ -Map kernel.map
 
%.s: %.S
/SPARTAN/trunk/arch/ppc/Makefile.inc
6,6 → 6,7
CC=$(PPC_CC_DIR)/$(PPC_TARGET)-gcc
AS=$(PPC_BINUTILS_DIR)/$(PPC_TARGET)-as
LD=$(PPC_BINUTILS_DIR)/$(PPC_TARGET)-ld
OBJDUMP=$(PPC_BINUTILS_DIR)/$(PPC_TARGET)-objdump
OBJCOPY=$(PPC_BINUTILS_DIR)/$(PPC_TARGET)-objcopy
BFD_NAME=elf32-powerpc
BFD_ARCH=powerpc
/SPARTAN/trunk/arch/ia64/Makefile.inc
6,6 → 6,7
CC=$(IA-64_CC_DIR)/$(IA-64_TARGET)-gcc
AS=$(IA-64_BINUTILS_DIR)/$(IA-64_TARGET)-as
LD=$(IA-64_BINUTILS_DIR)/$(IA-64_TARGET)-ld
OBJDUMP=$(IA-64_BINUTILS_DIR)/$(IA-64_TARGET)-objdump
OBJCOPY=$(IA-64_BINUTILS_DIR)/$(IA-64_TARGET)-objcopy
BFD_NAME=elf64-little
BFD_ARCH=ia64-elf64
/SPARTAN/trunk/arch/mips/Makefile.inc
6,6 → 6,7
CC=$(MIPS_CC_DIR)/$(MIPS_TARGET)-gcc
AS=$(MIPS_BINUTILS_DIR)/$(MIPS_TARGET)-as
LD=$(MIPS_BINUTILS_DIR)/$(MIPS_TARGET)-ld
OBJDUMP=$(MIPS_BINUTILS_DIR)/$(MIPS_TARGET)-objdump
OBJCOPY=$(MIPS_BINUTILS_DIR)/$(MIPS_TARGET)-objcopy
BFD_NAME=elf32-tradlittlemips
BFD_ARCH=mips
/SPARTAN/trunk/arch/amd64/Makefile.inc
5,6 → 5,7
CC=$(AMD64_CC_DIR)/$(AMD64_TARGET)-gcc
AS=$(AMD64_BINUTILS_DIR)/$(AMD64_TARGET)-as
LD=$(AMD64_BINUTILS_DIR)/$(AMD64_TARGET)-ld
OBJDUMP=$(AMD64_BINUTILS_DIR)/$(AMD64_TARGET)-objdump
OBJCOPY=$(AMD64_BINUTILS_DIR)/$(AMD64_TARGET)-objcopy
BFD_NAME=elf64-x86-64
BFD_ARCH=i386:x86-64
/SPARTAN/trunk/arch/amd64/src/boot/boot.S
157,7 → 157,7
.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
.fill 509,8,0
.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
.fill 2,8,0
.fill 1,8,0
.align 4096
.global ptl_0
/SPARTAN/trunk/arch/ia32/Makefile.inc
1,6 → 1,7
CC=gcc
AS=as
LD=ld
OBJDUMP=objdump
OBJCOPY=objcopy
BFD_NAME=elf32-i386
BFD_ARCH=i386