import java.util.List;
import org.eclipse.cdt.utils.elf.Elf;
+import org.eclipse.cdt.utils.elf.Elf.PHdr;
import org.eclipse.cdt.utils.elf.Elf.Symbol;
+import org.eclipse.cdt.utils.elf.Elf.ELFhdr;
import org.tizen.dynamicanalyzer.model.AddrSymbolPair;
public class ElfSymbolExtractor {
} else {
symbolMap = new HashMap<Long, String>();
}
+ long baseAddr = 0;
+
Elf elf;
try {
elf = new Elf(path);
elf.loadSymbols();
+
+ if (elf.getELFhdr().e_type == ELFhdr.ET_EXEC) {
+ PHdr[] phdrs = elf.getPHdrs();
+ for (PHdr phdr : phdrs) {
+ if (phdr.p_type == PHdr.PT_LOAD) {
+ baseAddr = phdr.p_vaddr.getValue().longValue();
+ break;
+ }
+ }
+ }
} catch (IOException e) {
e.printStackTrace();
return false;
}
+
Symbol[] symbols = elf.getSymbols();
for (Symbol symbol : symbols) {
if (symbol.st_type() != Elf.Symbol.STT_FUNC
|| symbol.st_shndx == Elf.Symbol.SHN_UNDEF) {
continue;
}
- long addr = symbol.st_value.getValue().longValue();
+ long addr = symbol.st_value.getValue().longValue() - baseAddr;
String symbolStr = symbol.toString();
symbolStr = SymbolManager.demanglingFunctionName(symbolStr);
symbolMap.put(addr, symbolStr);
return true;
}
+ @Deprecated
public Long[] getSymbolAddress() {
if (null == symbolMap || 0 == symbolMap.size()) {
return null;
return ret;
}
+ @Deprecated
public HashMap<Long, String> getSymbolMap() {
return symbolMap;
}