elfDefinedDynamicSymbols function
Returns the names of all defined symbols in the .dynsym section of a
64-bit little-endian ELF binary bytes.
Implementation
Set<String> elfDefinedDynamicSymbols(Uint8List bytes) {
final data = ByteData.sublistView(bytes);
final shoff = data.getUint64(40, Endian.little);
final shentsize = data.getUint16(58, Endian.little);
final shnum = data.getUint16(60, Endian.little);
const shtDynsym = 11;
for (var i = 0; i < shnum; i++) {
final shdr = shoff + i * shentsize;
final shType = data.getUint32(shdr + 4, Endian.little);
if (shType != shtDynsym) continue;
final symOffset = data.getUint64(shdr + 24, Endian.little);
final symSize = data.getUint64(shdr + 32, Endian.little);
final strTabIndex = data.getUint32(shdr + 40, Endian.little);
final symEntSize = data.getUint64(shdr + 56, Endian.little);
final strShdr = shoff + strTabIndex * shentsize;
final strOffset = data.getUint64(strShdr + 24, Endian.little);
final symbols = <String>{};
final count = symSize ~/ symEntSize;
for (var j = 0; j < count; j++) {
final sym = symOffset + j * symEntSize;
final stName = data.getUint32(sym, Endian.little);
final stShndx = data.getUint16(sym + 6, Endian.little);
if (stName == 0 || stShndx == 0) continue;
final start = strOffset + stName;
final end = bytes.indexOf(0, start);
symbols.add(String.fromCharCodes(bytes, start, end));
}
return symbols;
}
throw StateError('No .dynsym section found in ELF binary.');
}