INTERNAL: non-pie build binary support 36/22736/2
authorgreatim <jaewon81.lim@samsung.com>
Wed, 11 Jun 2014 03:27:50 +0000 (12:27 +0900)
committerjuyoung kim <j0.kim@samsung.com>
Wed, 11 Jun 2014 03:52:26 +0000 (20:52 -0700)
In TV-SDK, get relative address for non-pie build binary

Change-Id: I5d06625e160bb1be635da2f8dd7e9411aeb626d5
Signed-off-by: greatim <jaewon81.lim@samsung.com>
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/ElfSymbolExtractor.java

index 2e90683..f71873d 100644 (file)
@@ -32,7 +32,9 @@ import java.util.HashMap;
 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 {
@@ -56,21 +58,34 @@ 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);
@@ -79,6 +94,7 @@ public class ElfSymbolExtractor {
                return true;
        }
 
+       @Deprecated
        public Long[] getSymbolAddress() {
                if (null == symbolMap || 0 == symbolMap.size()) {
                        return null;
@@ -90,6 +106,7 @@ public class ElfSymbolExtractor {
                return ret;
        }
 
+       @Deprecated
        public HashMap<Long, String> getSymbolMap() {
                return symbolMap;
        }