authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-03-04 16:13:49-05:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-03-07 23:18:26+02:00
log5d215cc76bcac12afbda7b10ec04bbf6c5b47910
tree90e0accadd021cc11bea3e92ba96a373904843b6
parent0447a2c041a4be843251396e668e074186aa49a2

stage2 Elf linker: fill in bswapAllFields

I moved it to std.elf since it could be used there and added test

2 files changed, 35 insertions(+), 36 deletions(-)

lib/std/elf.zig+23-20
......@@ -422,16 +422,8 @@ pub fn ProgramHeaderIterator(ParseSource: anytype) type {
422422 if (self.elf_header.endian == std.builtin.endian) return phdr;
423423
424424 // Convert fields to native endianness.
425 return Elf64_Phdr{
426 .p_type = @byteSwap(@TypeOf(phdr.p_type), phdr.p_type),
427 .p_offset = @byteSwap(@TypeOf(phdr.p_offset), phdr.p_offset),
428 .p_vaddr = @byteSwap(@TypeOf(phdr.p_vaddr), phdr.p_vaddr),
429 .p_paddr = @byteSwap(@TypeOf(phdr.p_paddr), phdr.p_paddr),
430 .p_filesz = @byteSwap(@TypeOf(phdr.p_filesz), phdr.p_filesz),
431 .p_memsz = @byteSwap(@TypeOf(phdr.p_memsz), phdr.p_memsz),
432 .p_flags = @byteSwap(@TypeOf(phdr.p_flags), phdr.p_flags),
433 .p_align = @byteSwap(@TypeOf(phdr.p_align), phdr.p_align),
434 };
425 bswapAllFields(Elf64_Phdr, &phdr);
426 return phdr;
435427 }
436428
437429 var phdr: Elf32_Phdr = undefined;
......@@ -442,16 +434,7 @@ pub fn ProgramHeaderIterator(ParseSource: anytype) type {
442434 // ELF endianness does NOT match native endianness.
443435 if (self.elf_header.endian != std.builtin.endian) {
444436 // Convert fields to native endianness.
445 phdr = .{
446 .p_type = @byteSwap(@TypeOf(phdr.p_type), phdr.p_type),
447 .p_offset = @byteSwap(@TypeOf(phdr.p_offset), phdr.p_offset),
448 .p_vaddr = @byteSwap(@TypeOf(phdr.p_vaddr), phdr.p_vaddr),
449 .p_paddr = @byteSwap(@TypeOf(phdr.p_paddr), phdr.p_paddr),
450 .p_filesz = @byteSwap(@TypeOf(phdr.p_filesz), phdr.p_filesz),
451 .p_memsz = @byteSwap(@TypeOf(phdr.p_memsz), phdr.p_memsz),
452 .p_flags = @byteSwap(@TypeOf(phdr.p_flags), phdr.p_flags),
453 .p_align = @byteSwap(@TypeOf(phdr.p_align), phdr.p_align),
454 };
437 bswapAllFields(Elf32_Phdr, &phdr);
455438 }
456439
457440 // Convert 32-bit header to 64-bit.
......@@ -562,6 +545,26 @@ pub fn int32(need_bswap: bool, int_32: anytype, comptime Int64: anytype) Int64 {
562545 }
563546}
564547
548pub fn bswapAllFields(comptime S: type, ptr: *S) void {
549 if (@typeInfo(S) != .Struct) @compileError("bswapAllFields expects a struct as the first argument");
550 inline for (std.meta.fields(S)) |f| {
551 @field(ptr, f.name) = @byteSwap(f.field_type, @field(ptr, f.name));
552 }
553}
554test "bswapAllFields" {
555 var s: Elf32_Chdr = .{
556 .ch_type = 0x12341234,
557 .ch_size = 0x56785678,
558 .ch_addralign = 0x12124242,
559 };
560 bswapAllFields(Elf32_Chdr, &s);
561 std.testing.expectEqual(Elf32_Chdr{
562 .ch_type = 0x34123412,
563 .ch_size = 0x78567856,
564 .ch_addralign = 0x42421212,
565 }, s);
566}
567
565568pub const EI_NIDENT = 16;
566569
567570pub const EI_CLASS = 4;
src/link/Elf.zig+12-16
......@@ -1107,7 +1107,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation) !void {
11071107 for (buf) |*phdr, i| {
11081108 phdr.* = progHeaderTo32(self.program_headers.items[i]);
11091109 if (foreign_endian) {
1110 bswapAllFields(elf.Elf32_Phdr, phdr);
1110 std.elf.bswapAllFields(elf.Elf32_Phdr, phdr);
11111111 }
11121112 }
11131113 try self.base.file.?.pwriteAll(mem.sliceAsBytes(buf), self.phdr_table_offset.?);
......@@ -1119,7 +1119,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation) !void {
11191119 for (buf) |*phdr, i| {
11201120 phdr.* = self.program_headers.items[i];
11211121 if (foreign_endian) {
1122 bswapAllFields(elf.Elf64_Phdr, phdr);
1122 std.elf.bswapAllFields(elf.Elf64_Phdr, phdr);
11231123 }
11241124 }
11251125 try self.base.file.?.pwriteAll(mem.sliceAsBytes(buf), self.phdr_table_offset.?);
......@@ -1196,7 +1196,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation) !void {
11961196 shdr.* = sectHeaderTo32(self.sections.items[i]);
11971197 log.debug("writing section {}\n", .{shdr.*});
11981198 if (foreign_endian) {
1199 bswapAllFields(elf.Elf32_Shdr, shdr);
1199 std.elf.bswapAllFields(elf.Elf32_Shdr, shdr);
12001200 }
12011201 }
12021202 try self.base.file.?.pwriteAll(mem.sliceAsBytes(buf), self.shdr_table_offset.?);
......@@ -1209,7 +1209,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation) !void {
12091209 shdr.* = self.sections.items[i];
12101210 log.debug("writing section {}\n", .{shdr.*});
12111211 if (foreign_endian) {
1212 bswapAllFields(elf.Elf64_Shdr, shdr);
1212 std.elf.bswapAllFields(elf.Elf64_Shdr, shdr);
12131213 }
12141214 }
12151215 try self.base.file.?.pwriteAll(mem.sliceAsBytes(buf), self.shdr_table_offset.?);
......@@ -2787,14 +2787,14 @@ fn writeProgHeader(self: *Elf, index: usize) !void {
27872787 .p32 => {
27882788 var phdr = [1]elf.Elf32_Phdr{progHeaderTo32(self.program_headers.items[index])};
27892789 if (foreign_endian) {
2790 bswapAllFields(elf.Elf32_Phdr, &phdr[0]);
2790 std.elf.bswapAllFields(elf.Elf32_Phdr, &phdr[0]);
27912791 }
27922792 return self.base.file.?.pwriteAll(mem.sliceAsBytes(&phdr), offset);
27932793 },
27942794 .p64 => {
27952795 var phdr = [1]elf.Elf64_Phdr{self.program_headers.items[index]};
27962796 if (foreign_endian) {
2797 bswapAllFields(elf.Elf64_Phdr, &phdr[0]);
2797 std.elf.bswapAllFields(elf.Elf64_Phdr, &phdr[0]);
27982798 }
27992799 return self.base.file.?.pwriteAll(mem.sliceAsBytes(&phdr), offset);
28002800 },
......@@ -2808,7 +2808,7 @@ fn writeSectHeader(self: *Elf, index: usize) !void {
28082808 var shdr: [1]elf.Elf32_Shdr = undefined;
28092809 shdr[0] = sectHeaderTo32(self.sections.items[index]);
28102810 if (foreign_endian) {
2811 bswapAllFields(elf.Elf32_Shdr, &shdr[0]);
2811 std.elf.bswapAllFields(elf.Elf32_Shdr, &shdr[0]);
28122812 }
28132813 const offset = self.shdr_table_offset.? + index * @sizeOf(elf.Elf32_Shdr);
28142814 return self.base.file.?.pwriteAll(mem.sliceAsBytes(&shdr), offset);
......@@ -2816,7 +2816,7 @@ fn writeSectHeader(self: *Elf, index: usize) !void {
28162816 .p64 => {
28172817 var shdr = [1]elf.Elf64_Shdr{self.sections.items[index]};
28182818 if (foreign_endian) {
2819 bswapAllFields(elf.Elf64_Shdr, &shdr[0]);
2819 std.elf.bswapAllFields(elf.Elf64_Shdr, &shdr[0]);
28202820 }
28212821 const offset = self.shdr_table_offset.? + index * @sizeOf(elf.Elf64_Shdr);
28222822 return self.base.file.?.pwriteAll(mem.sliceAsBytes(&shdr), offset);
......@@ -2914,7 +2914,7 @@ fn writeSymbol(self: *Elf, index: usize) !void {
29142914 },
29152915 };
29162916 if (foreign_endian) {
2917 bswapAllFields(elf.Elf32_Sym, &sym[0]);
2917 std.elf.bswapAllFields(elf.Elf32_Sym, &sym[0]);
29182918 }
29192919 const off = syms_sect.sh_offset + @sizeOf(elf.Elf32_Sym) * index;
29202920 try self.base.file.?.pwriteAll(mem.sliceAsBytes(sym[0..1]), off);
......@@ -2922,7 +2922,7 @@ fn writeSymbol(self: *Elf, index: usize) !void {
29222922 .p64 => {
29232923 var sym = [1]elf.Elf64_Sym{self.local_symbols.items[index]};
29242924 if (foreign_endian) {
2925 bswapAllFields(elf.Elf64_Sym, &sym[0]);
2925 std.elf.bswapAllFields(elf.Elf64_Sym, &sym[0]);
29262926 }
29272927 const off = syms_sect.sh_offset + @sizeOf(elf.Elf64_Sym) * index;
29282928 try self.base.file.?.pwriteAll(mem.sliceAsBytes(sym[0..1]), off);
......@@ -2953,7 +2953,7 @@ fn writeAllGlobalSymbols(self: *Elf) !void {
29532953 .st_shndx = self.global_symbols.items[i].st_shndx,
29542954 };
29552955 if (foreign_endian) {
2956 bswapAllFields(elf.Elf32_Sym, sym);
2956 std.elf.bswapAllFields(elf.Elf32_Sym, sym);
29572957 }
29582958 }
29592959 try self.base.file.?.pwriteAll(mem.sliceAsBytes(buf), global_syms_off);
......@@ -2972,7 +2972,7 @@ fn writeAllGlobalSymbols(self: *Elf) !void {
29722972 .st_shndx = self.global_symbols.items[i].st_shndx,
29732973 };
29742974 if (foreign_endian) {
2975 bswapAllFields(elf.Elf64_Sym, sym);
2975 std.elf.bswapAllFields(elf.Elf64_Sym, sym);
29762976 }
29772977 }
29782978 try self.base.file.?.pwriteAll(mem.sliceAsBytes(buf), global_syms_off);
......@@ -3188,10 +3188,6 @@ fn pwriteDbgInfoNops(
31883188 try self.base.file.?.pwritevAll(vecs[0..vec_index], offset - prev_padding_size);
31893189}
31903190
3191fn bswapAllFields(comptime S: type, ptr: *S) void {
3192 @panic("TODO implement bswapAllFields");
3193}
3194
31953191fn progHeaderTo32(phdr: elf.Elf64_Phdr) elf.Elf32_Phdr {
31963192 return .{
31973193 .p_type = phdr.p_type,