@bugsplat/elfy
Version:
Tiny utility for parsing ELF/SELF files.
46 lines • 2.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElfFileHeader = exports.lengthOf64BitElfHeader = void 0;
exports.lengthOf64BitElfHeader = 64;
const elfMagic = [0x7f, 0x45, 0x4c, 0x46];
class ElfFileHeader {
constructor(segmentHeaderOffset, sectionHeaderOffset, segmentHeaderSize, segmentHeaderEntrySize, segmentHeaderEntryCount, sectionHeaderEntrySize, sectionHeaderEntryCount, stringTableIndex) {
this.segmentHeaderOffset = segmentHeaderOffset;
this.sectionHeaderOffset = sectionHeaderOffset;
this.segmentHeaderSize = segmentHeaderSize;
this.segmentHeaderEntrySize = segmentHeaderEntrySize;
this.segmentHeaderEntryCount = segmentHeaderEntryCount;
this.sectionHeaderEntrySize = sectionHeaderEntrySize;
this.sectionHeaderEntryCount = sectionHeaderEntryCount;
this.stringTableIndex = stringTableIndex;
}
static parse(buffer) {
if (buffer.length < exports.lengthOf64BitElfHeader) {
throw new Error('Could not parse ELF header, invalid buffer!');
}
const expected = Buffer.from(elfMagic);
const isElf = Buffer.compare(buffer.subarray(0, 4), expected) === 0;
if (!isElf) {
throw new Error('Could not parse ELF header, invalid ELF file!');
}
const is64Bit = Buffer.compare(buffer.subarray(4, 5), Buffer.from([0x02])) === 0;
if (!is64Bit) {
throw new Error('Could not parse ELF header, 32-bit ELF files are not supported!');
}
const isLE = Buffer.compare(buffer.subarray(5, 6), Buffer.from([0x01])) === 0;
if (!isLE) {
throw new Error('Could not parse ELF header, big endian is not supported!');
}
const segmentHeaderOffset = buffer.readBigUInt64LE(32);
const sectionHeaderOffset = buffer.readBigUInt64LE(40);
const segmentHeaderSize = buffer.readUint16LE(52);
const segmentHeaderEntrySize = buffer.readUint16LE(54);
const segmentHeaderEntryCount = buffer.readUint16LE(56);
const sectionHeaderEntrySize = buffer.readUint16LE(58);
const sectionHeaderEntryCount = buffer.readUint16LE(60);
const stringTableIndex = buffer.readUint16LE(62);
return new ElfFileHeader(segmentHeaderOffset, sectionHeaderOffset, segmentHeaderSize, segmentHeaderEntrySize, segmentHeaderEntryCount, sectionHeaderEntrySize, sectionHeaderEntryCount, stringTableIndex);
}
}
exports.ElfFileHeader = ElfFileHeader;
//# sourceMappingURL=file-header.js.map