elf.js 982 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. // Copyright 2017 Lovell Fuller and others.
  2. // SPDX-License-Identifier: Apache-2.0
  3. 'use strict';
  4. const interpreterPath = (elf) => {
  5. if (elf.length < 64) {
  6. return null;
  7. }
  8. if (elf.readUInt32BE(0) !== 0x7F454C46) {
  9. // Unexpected magic bytes
  10. return null;
  11. }
  12. if (elf.readUInt8(4) !== 2) {
  13. // Not a 64-bit ELF
  14. return null;
  15. }
  16. if (elf.readUInt8(5) !== 1) {
  17. // Not little-endian
  18. return null;
  19. }
  20. const offset = elf.readUInt32LE(32);
  21. const size = elf.readUInt16LE(54);
  22. const count = elf.readUInt16LE(56);
  23. for (let i = 0; i < count; i++) {
  24. const headerOffset = offset + (i * size);
  25. const type = elf.readUInt32LE(headerOffset);
  26. if (type === 3) {
  27. const fileOffset = elf.readUInt32LE(headerOffset + 8);
  28. const fileSize = elf.readUInt32LE(headerOffset + 32);
  29. return elf.subarray(fileOffset, fileOffset + fileSize).toString().replace(/\0.*$/g, '');
  30. }
  31. }
  32. return null;
  33. };
  34. module.exports = {
  35. interpreterPath
  36. };