summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/austin/sym/elf.go24
1 files changed, 15 insertions, 9 deletions
diff --git a/usr/austin/sym/elf.go b/usr/austin/sym/elf.go
index 5d92ce00f..95b7cc41c 100644
--- a/usr/austin/sym/elf.go
+++ b/usr/austin/sym/elf.go
@@ -168,18 +168,10 @@ func NewElf(r io.ReadSeeker) (*Elf, os.Error) {
}
blob := make([]byte, e.Sections[shstrndx].Size);
n, err = io.ReadFull(r, blob);
- strings := make(map[uint32] string);
- strStart := uint32(0);
- for i, c := range blob {
- if c == 0 {
- strings[strStart] = string(blob[strStart:i]);
- strStart = uint32(i+1);
- }
- }
for i, s := range e.Sections {
var ok bool;
- s.Name, ok = strings[secNames[i]];
+ s.Name, ok = getString(blob, int(secNames[i]));
if !ok {
return nil, &FormatError{start + shoff + int64(i*shentsize), "bad section name", secNames[i]};
}
@@ -188,6 +180,20 @@ func NewElf(r io.ReadSeeker) (*Elf, os.Error) {
return e, nil;
}
+// getString extracts a string from an ELF string table.
+func getString(section []byte, index int) (string, bool) {
+ if index < 0 || index >= len(section) {
+ return "", false;
+ }
+
+ for end := index; end < len(section); end++ {
+ if section[end] == 0 {
+ return string(section[index:end]), true;
+ }
+ }
+ return "", false;
+}
+
// Section returns a section with the given name, or nil if no such
// section exists.
func (e *Elf) Section(name string) *Section {