mirror of
https://github.com/morluto/rea.git
synced 2026-10-30 03:15:54 +00:00
85 lines
2.2 KiB
TypeScript
85 lines
2.2 KiB
TypeScript
import { expect, it } from "vitest";
|
|
import { readElfFixedHeader } from "./elfFixedHeader.js";
|
|
import { elf } from "./binaryTarget.fixture.js";
|
|
|
|
it.each([
|
|
["ELF32 little endian", 1, 1],
|
|
["ELF32 big endian", 1, 2],
|
|
["ELF64 little endian", 2, 1],
|
|
["ELF64 big endian", 2, 2],
|
|
] as const)(
|
|
"reads common fixed header commitments for %s",
|
|
(_name, cls, data) => {
|
|
const bytes = elf(cls, data, cls === 1 ? 3 : 62);
|
|
expect(readElfFixedHeader(bytes)).toEqual({
|
|
ok: true,
|
|
value: {
|
|
elfClass: cls === 1 ? 32 : 64,
|
|
byteOrder: data === 1 ? "little" : "big",
|
|
headerSize: cls === 1 ? 52 : 64,
|
|
machine: cls === 1 ? 3 : 62,
|
|
osAbi: 0,
|
|
architecture: cls === 1 ? "x86" : "x86_64",
|
|
},
|
|
});
|
|
},
|
|
);
|
|
|
|
it.each([
|
|
[
|
|
"identification version",
|
|
(bytes: Buffer) => {
|
|
bytes[6] = 0;
|
|
},
|
|
],
|
|
[
|
|
"header version",
|
|
(bytes: Buffer) => {
|
|
bytes.writeUInt32LE(0, 20);
|
|
},
|
|
],
|
|
[
|
|
"undersized declared header",
|
|
(bytes: Buffer) => {
|
|
bytes.writeUInt16LE(51, 40);
|
|
},
|
|
],
|
|
[
|
|
"declared header beyond file",
|
|
(bytes: Buffer) => {
|
|
bytes.writeUInt16LE(53, 40);
|
|
},
|
|
],
|
|
])("rejects an invalid %s", (_name, corrupt) => {
|
|
const bytes = elf(1, 1, 3);
|
|
corrupt(bytes);
|
|
expect(readElfFixedHeader(bytes)).toMatchObject({ ok: false });
|
|
});
|
|
|
|
it("checks declared header size against the whole file, not the prefix", () => {
|
|
const bytes = elf(2, 1, 62);
|
|
bytes.writeUInt16LE(128, 52);
|
|
expect(readElfFixedHeader(bytes, 128)).toMatchObject({ ok: true });
|
|
expect(readElfFixedHeader(bytes, 127)).toMatchObject({ ok: false });
|
|
});
|
|
|
|
it("preserves an unknown ELF machine as a fact without rejecting the header", () => {
|
|
expect(readElfFixedHeader(elf(2, 2, 0xfffe))).toMatchObject({
|
|
ok: true,
|
|
value: { machine: 0xfffe, architecture: null },
|
|
});
|
|
});
|
|
|
|
it("accepts NVIDIA's vendor ELF version only for the CUDA machine and OS ABI", () => {
|
|
const bytes = elf(2, 1, 190);
|
|
bytes.writeUInt32LE(0x81, 20);
|
|
expect(readElfFixedHeader(bytes).ok).toBe(false);
|
|
bytes[7] = 0x33;
|
|
expect(readElfFixedHeader(bytes)).toMatchObject({
|
|
ok: true,
|
|
value: { machine: 190 },
|
|
});
|
|
bytes.writeUInt16LE(62, 18);
|
|
expect(readElfFixedHeader(bytes).ok).toBe(false);
|
|
});
|