642 return scnhdrs; |
642 return scnhdrs; |
643 } |
643 } |
644 |
644 |
645 public Symbol[] getSymbols() throws IOException { |
645 public Symbol[] getSymbols() throws IOException { |
646 if (symbolTable == null) { |
646 if (symbolTable == null) { |
|
647 SectionHeader[] secHeaders = getSectionHeaders(); |
|
648 NTOptionalHeader ntHeader = getNTOptionalHeader(); |
|
649 |
647 RandomAccessFile accessFile = getRandomAccessFile(); |
650 RandomAccessFile accessFile = getRandomAccessFile(); |
648 long offset = fileHeader.f_symptr; |
651 long offset = fileHeader.f_symptr; |
649 symbolTable = new Symbol[fileHeader.f_nsyms]; |
652 symbolTable = new Symbol[fileHeader.f_nsyms]; |
650 for (int i = 0; i < symbolTable.length; i++, offset += Symbol.SYMSZ) { |
653 for (int i = 0; i < symbolTable.length; i++, offset += Symbol.SYMSZ) { |
651 symbolTable[i] = new Symbol(accessFile, offset); |
654 Symbol newSym = new Symbol(accessFile, offset); |
652 NTOptionalHeader ntHeader = getNTOptionalHeader(); |
655 |
653 // FIXME: What is this again ? |
656 // Now convert section offset of the symbol to image offset. |
|
657 if (newSym.n_scnum >= 1 && newSym.n_scnum <= secHeaders.length) // valid section # |
|
658 newSym.n_value += secHeaders[newSym.n_scnum-1].s_vaddr; |
|
659 |
|
660 // convert to absolute address. |
654 if (ntHeader != null) |
661 if (ntHeader != null) |
655 symbolTable[i].n_value += ntHeader.ImageBase + ntHeader.FileAlignment; |
662 newSym.n_value += ntHeader.ImageBase; |
|
663 |
|
664 symbolTable[i] = newSym; |
656 } |
665 } |
657 } |
666 } |
658 return symbolTable; |
667 return symbolTable; |
659 } |
668 } |
660 |
669 |