diff --git a/lib/std/elf.zig b/lib/std/elf.zig index fc9446f2b32335d7c3ed64dafd045e9d920d71c3..2db34ed943ed4aa38ccc4346f00ff7b2f26d59a1 100644 --- a/lib/std/elf.zig +++ b/lib/std/elf.zig @@ -1043,7 +1043,7 @@ pub const Elf32 = struct { pub const Addr = u32; pub const Off = u32; pub const Ehdr = extern struct { - ident: [EI.NIDENT]u8, + ident: Ident, type: ET, machine: EM, version: Word, @@ -1133,7 +1133,7 @@ pub const Elf64 = struct { pub const Addr = u64; pub const Off = u64; pub const Ehdr = extern struct { - ident: [EI.NIDENT]u8, + ident: Ident, type: ET, machine: EM, version: Word, @@ -1611,6 +1611,20 @@ pub const Sym = switch (@sizeOf(usize)) { /// Deprecated, use `std.elf.ElfN.Addr` pub const Addr = ElfN.Addr; +pub const Ident = extern struct { + magic: [MAGIC.len]u8 = MAGIC.*, + class: CLASS, + data: DATA, + version: u8, + osabi: OSABI, + abiversion: u8, + pad: [7]u8 = @splat(0), + + comptime { + assert(@sizeOf(Ident) == EI.NIDENT); + } +}; + /// Deprecated, use `@intFromEnum(std.elf.CLASS.NONE)` pub const ELFCLASSNONE = @intFromEnum(CLASS.NONE); /// Deprecated, use `@intFromEnum(std.elf.CLASS.@"32")` diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 453dcced31f3c835333212f094574e77f7a59a10..1f4288ea99651e3ccf8a22e03c1abf33c140dbeb 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -834,7 +834,7 @@ pub fn dl_iterate_phdr( while (it.next()) |entry| { const phdrs: []elf.ElfN.Phdr = if (entry.addr != 0) phdrs: { const ehdr: *elf.ElfN.Ehdr = @ptrFromInt(entry.addr); - assert(mem.eql(u8, ehdr.ident[0..4], elf.MAGIC)); + assert(mem.eql(u8, &ehdr.ident.magic, elf.MAGIC)); const phdrs: [*]elf.ElfN.Phdr = @ptrFromInt(entry.addr + ehdr.phoff); break :phdrs phdrs[0..ehdr.phnum]; } else getSelfPhdrs(); diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index 164401c90f450842100c2055d87ea6dd1d577187..4a07c7a0546b22a68595c45f7044a1f9597885d7 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -1150,14 +1150,13 @@ fn initHeaders( elf.nodes.appendAssumeCapacity(.ehdr); const ehdr: *ElfN.Ehdr = @ptrCast(@alignCast(elf.ni.ehdr.slice(&elf.mf))); - const EI = std.elf.EI; - @memcpy(ehdr.ident[0..std.elf.MAGIC.len], std.elf.MAGIC); - ehdr.ident[EI.CLASS] = @intFromEnum(class); - ehdr.ident[EI.DATA] = @intFromEnum(data); - ehdr.ident[EI.VERSION] = 1; - ehdr.ident[EI.OSABI] = @intFromEnum(osabi); - ehdr.ident[EI.ABIVERSION] = 0; - @memset(ehdr.ident[EI.PAD..], 0); + ehdr.ident = .{ + .class = class, + .data = data, + .version = 1, + .osabi = osabi, + .abiversion = 0, + }; ehdr.type = @"type"; ehdr.machine = machine; ehdr.version = 1;