authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-12 10:43:58-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-12 10:44:17-07:00
logde04a8a1ef0ea37df7c09a997f60a3c1138de124
treeb8a6c41e3ae10413a19e930bf5c8ab8f27788d13
parent49637f537269ed98efb95a82e63ef73f6a9606a9

std.dynamic_library: update to new elf API


2 files changed, 22 insertions(+), 25 deletions(-)

lib/std/dynamic_library.zig+14-16
...@@ -141,7 +141,7 @@ pub const ElfDynLib = struct {...@@ -141,7 +141,7 @@ pub const ElfDynLib = struct {
141 strings: [*:0]u8,141 strings: [*:0]u8,
142 syms: [*]elf.Sym,142 syms: [*]elf.Sym,
143 hashtab: [*]posix.Elf_Symndx,143 hashtab: [*]posix.Elf_Symndx,
144 versym: ?[*]u16,144 versym: ?[*]elf.Versym,
145 verdef: ?*elf.Verdef,145 verdef: ?*elf.Verdef,
146 memory: []align(mem.page_size) u8,146 memory: []align(mem.page_size) u8,
147147
...@@ -319,7 +319,7 @@ pub const ElfDynLib = struct {...@@ -319,7 +319,7 @@ pub const ElfDynLib = struct {
319 var maybe_strings: ?[*:0]u8 = null;319 var maybe_strings: ?[*:0]u8 = null;
320 var maybe_syms: ?[*]elf.Sym = null;320 var maybe_syms: ?[*]elf.Sym = null;
321 var maybe_hashtab: ?[*]posix.Elf_Symndx = null;321 var maybe_hashtab: ?[*]posix.Elf_Symndx = null;
322 var maybe_versym: ?[*]u16 = null;322 var maybe_versym: ?[*]elf.Versym = null;
323 var maybe_verdef: ?*elf.Verdef = null;323 var maybe_verdef: ?*elf.Verdef = null;
324324
325 {325 {
...@@ -327,11 +327,11 @@ pub const ElfDynLib = struct {...@@ -327,11 +327,11 @@ pub const ElfDynLib = struct {
327 while (dynv[i] != 0) : (i += 2) {327 while (dynv[i] != 0) : (i += 2) {
328 const p = base + dynv[i + 1];328 const p = base + dynv[i + 1];
329 switch (dynv[i]) {329 switch (dynv[i]) {
330 elf.DT_STRTAB => maybe_strings = @as([*:0]u8, @ptrFromInt(p)),330 elf.DT_STRTAB => maybe_strings = @ptrFromInt(p),
331 elf.DT_SYMTAB => maybe_syms = @as([*]elf.Sym, @ptrFromInt(p)),331 elf.DT_SYMTAB => maybe_syms = @ptrFromInt(p),
332 elf.DT_HASH => maybe_hashtab = @as([*]posix.Elf_Symndx, @ptrFromInt(p)),332 elf.DT_HASH => maybe_hashtab = @ptrFromInt(p),
333 elf.DT_VERSYM => maybe_versym = @as([*]u16, @ptrFromInt(p)),333 elf.DT_VERSYM => maybe_versym = @ptrFromInt(p),
334 elf.DT_VERDEF => maybe_verdef = @as(*elf.Verdef, @ptrFromInt(p)),334 elf.DT_VERDEF => maybe_verdef = @ptrFromInt(p),
335 else => {},335 else => {},
336 }336 }
337 }337 }
...@@ -399,18 +399,16 @@ pub const ElfDynLib = struct {...@@ -399,18 +399,16 @@ pub const ElfDynLib = struct {
399 }399 }
400};400};
401401
402fn checkver(def_arg: *elf.Verdef, vsym_arg: i32, vername: []const u8, strings: [*:0]u8) bool {402fn checkver(def_arg: *elf.Verdef, vsym_arg: elf.Versym, vername: []const u8, strings: [*:0]u8) bool {
403 var def = def_arg;403 var def = def_arg;
404 const vsym = @as(u32, @bitCast(vsym_arg)) & 0x7fff;404 const vsym_index = vsym_arg.VERSION;
405 while (true) {405 while (true) {
406 if (0 == (def.vd_flags & elf.VER_FLG_BASE) and (def.vd_ndx & 0x7fff) == vsym)406 if (0 == (def.flags & elf.VER_FLG_BASE) and @intFromEnum(def.ndx) == vsym_index) break;
407 break;407 if (def.next == 0) return false;
408 if (def.vd_next == 0)408 def = @ptrFromInt(@intFromPtr(def) + def.next);
409 return false;
410 def = @as(*elf.Verdef, @ptrFromInt(@intFromPtr(def) + def.vd_next));
411 }409 }
412 const aux = @as(*elf.Verdaux, @ptrFromInt(@intFromPtr(def) + def.vd_aux));410 const aux: *elf.Verdaux = @ptrFromInt(@intFromPtr(def) + def.aux);
413 return mem.eql(u8, vername, mem.sliceTo(strings + aux.vda_name, 0));411 return mem.eql(u8, vername, mem.sliceTo(strings + aux.name, 0));
414}412}
415413
416test "ElfDynLib" {414test "ElfDynLib" {
lib/std/os/linux/vdso.zig+8-9
...@@ -34,7 +34,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {...@@ -34,7 +34,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
34 const dynv = maybe_dynv orelse return 0;34 const dynv = maybe_dynv orelse return 0;
35 if (base == maxInt(usize)) return 0;35 if (base == maxInt(usize)) return 0;
3636
37 var maybe_strings: ?[*]u8 = null;37 var maybe_strings: ?[*:0]u8 = null;
38 var maybe_syms: ?[*]elf.Sym = null;38 var maybe_syms: ?[*]elf.Sym = null;
39 var maybe_hashtab: ?[*]linux.Elf_Symndx = null;39 var maybe_hashtab: ?[*]linux.Elf_Symndx = null;
40 var maybe_versym: ?[*]elf.Versym = null;40 var maybe_versym: ?[*]elf.Versym = null;
...@@ -45,11 +45,11 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {...@@ -45,11 +45,11 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
45 while (dynv[i] != 0) : (i += 2) {45 while (dynv[i] != 0) : (i += 2) {
46 const p = base +% dynv[i + 1];46 const p = base +% dynv[i + 1];
47 switch (dynv[i]) {47 switch (dynv[i]) {
48 elf.DT_STRTAB => maybe_strings = @as([*]u8, @ptrFromInt(p)),48 elf.DT_STRTAB => maybe_strings = @ptrFromInt(p),
49 elf.DT_SYMTAB => maybe_syms = @as([*]elf.Sym, @ptrFromInt(p)),49 elf.DT_SYMTAB => maybe_syms = @ptrFromInt(p),
50 elf.DT_HASH => maybe_hashtab = @as([*]linux.Elf_Symndx, @ptrFromInt(p)),50 elf.DT_HASH => maybe_hashtab = @ptrFromInt(p),
51 elf.DT_VERSYM => maybe_versym = @as([*]elf.Versym, @ptrFromInt(p)),51 elf.DT_VERSYM => maybe_versym = @ptrFromInt(p),
52 elf.DT_VERDEF => maybe_verdef = @as(*elf.Verdef, @ptrFromInt(p)),52 elf.DT_VERDEF => maybe_verdef = @ptrFromInt(p),
53 else => {},53 else => {},
54 }54 }
55 }55 }
...@@ -80,7 +80,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {...@@ -80,7 +80,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
80 return 0;80 return 0;
81}81}
8282
83fn checkver(def_arg: *elf.Verdef, vsym_arg: elf.Versym, vername: []const u8, strings: [*]u8) bool {83fn checkver(def_arg: *elf.Verdef, vsym_arg: elf.Versym, vername: []const u8, strings: [*:0]u8) bool {
84 var def = def_arg;84 var def = def_arg;
85 const vsym_index = vsym_arg.VERSION;85 const vsym_index = vsym_arg.VERSION;
86 while (true) {86 while (true) {
...@@ -89,6 +89,5 @@ fn checkver(def_arg: *elf.Verdef, vsym_arg: elf.Versym, vername: []const u8, str...@@ -89,6 +89,5 @@ fn checkver(def_arg: *elf.Verdef, vsym_arg: elf.Versym, vername: []const u8, str
89 def = @ptrFromInt(@intFromPtr(def) + def.next);89 def = @ptrFromInt(@intFromPtr(def) + def.next);
90 }90 }
91 const aux: *elf.Verdaux = @ptrFromInt(@intFromPtr(def) + def.aux);91 const aux: *elf.Verdaux = @ptrFromInt(@intFromPtr(def) + def.aux);
92 const vda_name: [*:0]u8 = @ptrCast(strings + aux.name);92 return mem.eql(u8, vername, mem.sliceTo(strings + aux.name, 0));
93 return mem.eql(u8, vername, mem.sliceTo(vda_name, 0));
94}93}