|
|
BSD 4.3
# LOADMAP(1)
#
# Produce load map of object file
#
# Stephen B. Wampler
#
# Last modified 7/10/83
#
record entry(name,address)
procedure main(args)
local maptype, arg, file, nm, ldmap, tname, line, text, data, bss
local SPACE, COLON, DIGITS, HEXDIGITS, usize, address, name
initial {
if *args = 0 then stop("usage: loadmap -tdbuac file")
SPACE := '\t '
COLON := ':'
DIGITS := '0123456789'
HEXDIGITS := DIGITS ++ 'abcdef'
ldmap := table(6)
ldmap["u"] := []
ldmap["d"] := []
ldmap["a"] := []
ldmap["b"] := []
ldmap["t"] := []
ldmap["c"] := []
tname := table(6)
tname["u"] := "Undefined symbols"
tname["a"] := "Absolute locations"
tname["t"] := "Text segment symbols"
tname["d"] := "Data segment symbols"
tname["b"] := "BSS segment symbols"
tname["c"] := "Common symbols"
}
maptype := ""
every arg := !args do
if arg[1] ~== "-" then file := arg
else if arg[1] == "-" then maptype ||:= (!"tdbuac" == arg[2:0]) |
stop("usage: loadmap -tdbuac file")
maptype := if *maptype = 0 then "t" else string(cset(maptype))
write("\n",file,"\n")
usize := open("size " || file,"rp") | stop("loadmap: cannot execute size")
!usize ? {
writes("Text space: ",right(text := tab(many(DIGITS)),6)," ")
move(1)
writes("Initialized Data: ",right(data := tab(many(DIGITS)),6)," ")
move(1)
write("Uninitialized Data: ",right(bss := tab(many(DIGITS)),6))
}
close(usize)
nm := open("nm -gno " || file,"rp") | stop("loadmap: cannot execute nm")
every line := !nm do
line ? {
tab(upto(COLON)) & move(1)
address := integer("16r" || tab(many(HEXDIGITS))) | "????"
tab(many(SPACE))
type := map(move(1))
tab(many(SPACE))
name := tab(0)
if find(type,maptype) then put(ldmap[type],entry(name,address))
}
every type := !maptype do {
if *ldmap[type] > 0 then {
write("\n\n\n")
write(tname[type],":")
write()
show(ldmap[type],(type == "t" & text) |
(type == "d" & data) | (type == "b" & bss) | &null,
ldmap[type][1].address)
}
}
end
procedure show(l,ssize,base)
local i1, i2, nrows
static ncols
initial ncols := 3
write(repl(repl(" ",3) || left("name",9) || right("addr",7) ||
right("size",6),ncols))
write()
nrows := (*l + (ncols - 1)) / ncols
every i1 := 1 to nrows do {
every i2 := i1 to *l by nrows do
writes(repl(" ",3),left(l[i2].name,9),right(l[i2].address,7),
right(area(l[i2 + 1].address,l[i2].address) |
if /ssize then "rem" else base + ssize - l[i2].address,6))
write()
}
return
end
procedure area(high,low)
if integer(low) & integer(high) then return high - low
else return "????"
end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.