elfDefinedDynamicSymbols function

Set<String> elfDefinedDynamicSymbols(
  1. Uint8List bytes
)

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.');
}