package parser.elf;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Dynsym {
private final static int ST_NAME = 0X0;
private final static int ST_VALUE = 0X04;
private final static int ST_SIZE = 0X08;
private final static int ST_INFO = 0X0c;
private final static int ST_OTHER = 0X0d;
private final static int ST_SHNDX = 0X0e;
List<String> exportFuction = new ArrayList<>();
List<String> symbols = new ArrayList<>();
ByteBuffer data;
int dynsymOff;
int dynstrOff;
int dynsymSize;
public Dynsym(ByteBuffer data, int dynsymOff, int dynstrOff, int dynsymSize) {
this.data = data;
this.dynsymOff = dynsymOff;
this.dynstrOff = dynstrOff;
this.dynsymSize = dynsymSize;
for (int i = 0; i < dynsymSize; i = i + 16) {
int off = dynsymOff + i;
int noff = dynstrOff + data.getInt(off + ST_NAME);
int st_type = data.get(off + ST_INFO) & 0x0f;
int st_shndx = data.getShort(off + ST_SHNDX);
// System.out.println("\nst_value:"+Integer.toHexString(data.getInt(off+ST_VALUE)));
// System.out.println("st_size:"+data.getInt(off+ST_SIZE));
// System.out.println("st_bin:"+((data.get(off+ST_INFO)>>4)&0x0f));
// System.out.println("st_type:"+(data.get(off+ST_INFO)&0x0f));
// System.out.println("st_shndx:"+data.getShort(off+ST_SHNDX));
int k = 0;
while (data.get(noff + (k++)) != 0x0) ;
String na = new String(Arrays.copyOfRange(data.array(), noff, noff + k - 1));
symbols.add(na);
if ((st_type == 1 || st_type == 2) && st_shndx != 0)
exportFuction.add(na);
// System.out.println(na+"->"+i/16);
}
}
public List<String> getDynsymbols() {
return symbols;
}
public List<String> getExportFuction() {
return exportFuction;
}
}