/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]) |
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 |