aboutsummaryrefslogtreecommitdiff
path: root/lib/std/elf.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2025-10-29 18:01:10 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2025-10-29 18:06:17 -0400
commit7542c3260f93e92fd8da7e5329bc80fd601964e9 (patch)
tree1df5785b192e3098ca2823fc068c55757d2a7f78 /lib/std/elf.zig
parent6f0476e41d2f9b040a9883b288171c6a50c29ed5 (diff)
downloadzig-7542c3260f93e92fd8da7e5329bc80fd601964e9.tar.gz
zig-7542c3260f93e92fd8da7e5329bc80fd601964e9.zip
Elf2: load relocations from input objects
Diffstat (limited to 'lib/std/elf.zig')
-rw-r--r--lib/std/elf.zig46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/std/elf.zig b/lib/std/elf.zig
index c5f8a7ea80..2f00cef22c 100644
--- a/lib/std/elf.zig
+++ b/lib/std/elf.zig
@@ -943,11 +943,30 @@ pub const Elf32 = struct {
unused: u5 = 0,
};
};
+ pub const Rel = extern struct {
+ offset: Elf32.Addr,
+ info: Info,
+ addend: u0 = 0,
+
+ pub const Info = packed struct(u32) {
+ type: u8,
+ sym: u24,
+ };
+ };
+ pub const Rela = extern struct {
+ offset: Elf32.Addr,
+ info: Info,
+ addend: i32,
+
+ pub const Info = Elf32.Rel.Info;
+ };
comptime {
assert(@sizeOf(Elf32.Ehdr) == 52);
assert(@sizeOf(Elf32.Phdr) == 32);
assert(@sizeOf(Elf32.Shdr) == 40);
assert(@sizeOf(Elf32.Sym) == 16);
+ assert(@sizeOf(Elf32.Rel) == 8);
+ assert(@sizeOf(Elf32.Rela) == 12);
}
};
pub const Elf64 = struct {
@@ -1008,11 +1027,30 @@ pub const Elf64 = struct {
pub const Info = Elf32.Sym.Info;
pub const Other = Elf32.Sym.Other;
};
+ pub const Rel = extern struct {
+ offset: Elf64.Addr,
+ info: Info,
+ addend: u0 = 0,
+
+ pub const Info = packed struct(u64) {
+ type: u32,
+ sym: u32,
+ };
+ };
+ pub const Rela = extern struct {
+ offset: Elf64.Addr,
+ info: Info,
+ addend: i64,
+
+ pub const Info = Elf64.Rel.Info;
+ };
comptime {
assert(@sizeOf(Elf64.Ehdr) == 64);
assert(@sizeOf(Elf64.Phdr) == 56);
assert(@sizeOf(Elf64.Shdr) == 64);
assert(@sizeOf(Elf64.Sym) == 24);
+ assert(@sizeOf(Elf64.Rel) == 16);
+ assert(@sizeOf(Elf64.Rela) == 24);
}
};
pub const ElfN = switch (@sizeOf(usize)) {
@@ -1428,6 +1466,14 @@ pub const CLASS = enum(u8) {
_,
pub const NUM = @typeInfo(CLASS).@"enum".fields.len;
+
+ pub fn ElfN(comptime class: CLASS) type {
+ return switch (class) {
+ .NONE, _ => comptime unreachable,
+ .@"32" => Elf32,
+ .@"64" => Elf64,
+ };
+ }
};
/// Deprecated, use `@intFromEnum(std.elf.DATA.NONE)`