make elphin shut up in pipelines
This commit is contained in:
parent
d33c09a1ab
commit
b7c527394d
6 changed files with 27 additions and 16 deletions
|
@ -1,6 +1,6 @@
|
||||||
.{
|
.{
|
||||||
.name = "elphin",
|
.name = "elphin",
|
||||||
.version = "0.1.5",
|
.version = "0.1.6",
|
||||||
.minimum_zig_version = "0.12.0",
|
.minimum_zig_version = "0.12.0",
|
||||||
.paths = .{
|
.paths = .{
|
||||||
"build.zig",
|
"build.zig",
|
||||||
|
|
|
@ -60,7 +60,7 @@ fn make(step: *std.Build.Step, _: *std.Progress.Node) !void {
|
||||||
defer output.close();
|
defer output.close();
|
||||||
|
|
||||||
// Run conversion
|
// Run conversion
|
||||||
try lib.convert(input, output);
|
try lib.convert(input, output, false);
|
||||||
|
|
||||||
// Copy file to destination
|
// Copy file to destination
|
||||||
const cwd = std.fs.cwd();
|
const cwd = std.fs.cwd();
|
||||||
|
|
|
@ -83,7 +83,7 @@ pub fn createDOLMapping(segments: elf.ELFSegments) DolMap {
|
||||||
return dolMap;
|
return dolMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn writeDOL(map: DolMap, input: std.fs.File, output: std.fs.File) !void {
|
pub fn writeDOL(map: DolMap, input: std.fs.File, output: std.fs.File, verbose: bool) !void {
|
||||||
const reader = input.reader();
|
const reader = input.reader();
|
||||||
const writer = output.writer();
|
const writer = output.writer();
|
||||||
|
|
||||||
|
@ -106,7 +106,9 @@ pub fn writeDOL(map: DolMap, input: std.fs.File, output: std.fs.File) !void {
|
||||||
try output.seekTo(map.header.textOffsets[i]);
|
try output.seekTo(map.header.textOffsets[i]);
|
||||||
|
|
||||||
// Copy segment
|
// Copy segment
|
||||||
|
if (verbose) {
|
||||||
std.log.debug("Copying text segment {d} at 0x{x} -> 0x{x}", .{ i, map.header.textAddress[i], map.header.textOffsets[i] });
|
std.log.debug("Copying text segment {d} at 0x{x} -> 0x{x}", .{ i, map.header.textAddress[i], map.header.textOffsets[i] });
|
||||||
|
}
|
||||||
try fifo.pump(&limitedReader, writer);
|
try fifo.pump(&limitedReader, writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +124,9 @@ pub fn writeDOL(map: DolMap, input: std.fs.File, output: std.fs.File) !void {
|
||||||
try output.seekTo(map.header.dataOffsets[i]);
|
try output.seekTo(map.header.dataOffsets[i]);
|
||||||
|
|
||||||
// Copy segment
|
// Copy segment
|
||||||
|
if (verbose) {
|
||||||
std.log.debug("Copying data segment {d} at 0x{x} -> 0x{x}", .{ i, map.header.dataAddress[i], map.header.dataOffsets[i] });
|
std.log.debug("Copying data segment {d} at 0x{x} -> 0x{x}", .{ i, map.header.dataAddress[i], map.header.dataOffsets[i] });
|
||||||
|
}
|
||||||
try fifo.pump(&limitedReader, writer);
|
try fifo.pump(&limitedReader, writer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
13
src/elf.zig
13
src/elf.zig
|
@ -78,7 +78,7 @@ pub const ELFSegments = struct {
|
||||||
bssSize: u32,
|
bssSize: u32,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn readELF(file: std.fs.File) !ELFSegments {
|
pub fn readELF(file: std.fs.File, verbose: bool) !ELFSegments {
|
||||||
// Create segment map
|
// Create segment map
|
||||||
var elfMap: ELFSegments = .{
|
var elfMap: ELFSegments = .{
|
||||||
.entryPoint = undefined,
|
.entryPoint = undefined,
|
||||||
|
@ -156,10 +156,14 @@ pub fn readELF(file: std.fs.File) !ELFSegments {
|
||||||
if (programHeader.p_filesz < programHeader.p_memsz) {
|
if (programHeader.p_filesz < programHeader.p_memsz) {
|
||||||
// Add as BSS segment of whatever is left between the file and memory sizes
|
// Add as BSS segment of whatever is left between the file and memory sizes
|
||||||
addOrExtendBSS(&elfMap, programHeader.p_paddr + programHeader.p_filesz, programHeader.p_memsz - programHeader.p_filesz);
|
addOrExtendBSS(&elfMap, programHeader.p_paddr + programHeader.p_filesz, programHeader.p_memsz - programHeader.p_filesz);
|
||||||
|
if (verbose) {
|
||||||
std.log.debug("Found bss segment (TEXT) at 0x{x}", .{programHeader.p_paddr + programHeader.p_filesz});
|
std.log.debug("Found bss segment (TEXT) at 0x{x}", .{programHeader.p_paddr + programHeader.p_filesz});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
std.log.debug("Found text segment at 0x{x}", .{programHeader.p_vaddr});
|
std.log.debug("Found text segment at 0x{x}", .{programHeader.p_vaddr});
|
||||||
|
}
|
||||||
|
|
||||||
elfMap.text[elfMap.textCount] = .{
|
elfMap.text[elfMap.textCount] = .{
|
||||||
.address = programHeader.p_paddr,
|
.address = programHeader.p_paddr,
|
||||||
|
@ -170,11 +174,12 @@ pub fn readELF(file: std.fs.File) !ELFSegments {
|
||||||
elfMap.textCount += 1;
|
elfMap.textCount += 1;
|
||||||
} else {
|
} else {
|
||||||
// DATA or BSS segment
|
// DATA or BSS segment
|
||||||
|
|
||||||
// TODO: ????
|
|
||||||
if (programHeader.p_filesz == 0) {
|
if (programHeader.p_filesz == 0) {
|
||||||
addOrExtendBSS(&elfMap, programHeader.p_paddr, programHeader.p_memsz);
|
addOrExtendBSS(&elfMap, programHeader.p_paddr, programHeader.p_memsz);
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
std.log.debug("Found bss segment (DATA) at 0x{x}", .{programHeader.p_vaddr});
|
std.log.debug("Found bss segment (DATA) at 0x{x}", .{programHeader.p_vaddr});
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,7 +188,9 @@ pub fn readELF(file: std.fs.File) !ELFSegments {
|
||||||
return ELFError.TooManyDataSegments;
|
return ELFError.TooManyDataSegments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
std.log.debug("Found data segment at 0x{x}", .{programHeader.p_vaddr});
|
std.log.debug("Found data segment at 0x{x}", .{programHeader.p_vaddr});
|
||||||
|
}
|
||||||
|
|
||||||
elfMap.data[elfMap.dataCount] = .{
|
elfMap.data[elfMap.dataCount] = .{
|
||||||
.address = programHeader.p_paddr,
|
.address = programHeader.p_paddr,
|
||||||
|
|
|
@ -10,13 +10,13 @@ pub const writeDOL = dol.writeDOL;
|
||||||
|
|
||||||
/// Converts an ELF file to a DOL file.
|
/// Converts an ELF file to a DOL file.
|
||||||
/// `input` and `output` must be open files.
|
/// `input` and `output` must be open files.
|
||||||
pub fn convert(input: anytype, output: anytype) !void {
|
pub fn convert(input: anytype, output: anytype, verbose: bool) !void {
|
||||||
// Read input
|
// Read input
|
||||||
const map = try elf.readELF(input);
|
const map = try elf.readELF(input, verbose);
|
||||||
|
|
||||||
// Align segments to 64 byte boundaries
|
// Align segments to 64 byte boundaries
|
||||||
const dolMap = dol.createDOLMapping(map);
|
const dolMap = dol.createDOLMapping(map);
|
||||||
|
|
||||||
// Write header and copy over segments from input
|
// Write header and copy over segments from input
|
||||||
try dol.writeDOL(dolMap, input, output);
|
try dol.writeDOL(dolMap, input, output, verbose);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,5 +27,5 @@ pub fn main() !void {
|
||||||
const output = try std.fs.cwd().createFile(outputPath, .{});
|
const output = try std.fs.cwd().createFile(outputPath, .{});
|
||||||
defer output.close();
|
defer output.close();
|
||||||
|
|
||||||
try lib.convert(input, output);
|
try lib.convert(input, output, true);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue