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 {
141141 strings: [*:0]u8,
142142 syms: [*]elf.Sym,
143143 hashtab: [*]posix.Elf_Symndx,
144 versym: ?[*]u16,
144 versym: ?[*]elf.Versym,
145145 verdef: ?*elf.Verdef,
146146 memory: []align(mem.page_size) u8,
147147
......@@ -319,7 +319,7 @@ pub const ElfDynLib = struct {
319319 var maybe_strings: ?[*:0]u8 = null;
320320 var maybe_syms: ?[*]elf.Sym = null;
321321 var maybe_hashtab: ?[*]posix.Elf_Symndx = null;
322 var maybe_versym: ?[*]u16 = null;
322 var maybe_versym: ?[*]elf.Versym = null;
323323 var maybe_verdef: ?*elf.Verdef = null;
324324
325325 {
......@@ -327,11 +327,11 @@ pub const ElfDynLib = struct {
327327 while (dynv[i] != 0) : (i += 2) {
328328 const p = base + dynv[i + 1];
329329 switch (dynv[i]) {
330 elf.DT_STRTAB => maybe_strings = @as([*:0]u8, @ptrFromInt(p)),
331 elf.DT_SYMTAB => maybe_syms = @as([*]elf.Sym, @ptrFromInt(p)),
332 elf.DT_HASH => maybe_hashtab = @as([*]posix.Elf_Symndx, @ptrFromInt(p)),
333 elf.DT_VERSYM => maybe_versym = @as([*]u16, @ptrFromInt(p)),
334 elf.DT_VERDEF => maybe_verdef = @as(*elf.Verdef, @ptrFromInt(p)),
330 elf.DT_STRTAB => maybe_strings = @ptrFromInt(p),
331 elf.DT_SYMTAB => maybe_syms = @ptrFromInt(p),
332 elf.DT_HASH => maybe_hashtab = @ptrFromInt(p),
333 elf.DT_VERSYM => maybe_versym = @ptrFromInt(p),
334 elf.DT_VERDEF => maybe_verdef = @ptrFromInt(p),
335335 else => {},
336336 }
337337 }
......@@ -399,18 +399,16 @@ pub const ElfDynLib = struct {
399399 }
400400};
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 {
403403 var def = def_arg;
404 const vsym = @as(u32, @bitCast(vsym_arg)) & 0x7fff;
404 const vsym_index = vsym_arg.VERSION;
405405 while (true) {
406 if (0 == (def.vd_flags & elf.VER_FLG_BASE) and (def.vd_ndx & 0x7fff) == vsym)
407 break;
408 if (def.vd_next == 0)
409 return false;
410 def = @as(*elf.Verdef, @ptrFromInt(@intFromPtr(def) + def.vd_next));
406 if (0 == (def.flags & elf.VER_FLG_BASE) and @intFromEnum(def.ndx) == vsym_index) break;
407 if (def.next == 0) return false;
408 def = @ptrFromInt(@intFromPtr(def) + def.next);
411409 }
412 const aux = @as(*elf.Verdaux, @ptrFromInt(@intFromPtr(def) + def.vd_aux));
413 return mem.eql(u8, vername, mem.sliceTo(strings + aux.vda_name, 0));
410 const aux: *elf.Verdaux = @ptrFromInt(@intFromPtr(def) + def.aux);
411 return mem.eql(u8, vername, mem.sliceTo(strings + aux.name, 0));
414412}
415413
416414test "ElfDynLib" {
lib/std/os/linux/vdso.zig+8-9
......@@ -34,7 +34,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
3434 const dynv = maybe_dynv orelse return 0;
3535 if (base == maxInt(usize)) return 0;
3636
37 var maybe_strings: ?[*]u8 = null;
37 var maybe_strings: ?[*:0]u8 = null;
3838 var maybe_syms: ?[*]elf.Sym = null;
3939 var maybe_hashtab: ?[*]linux.Elf_Symndx = null;
4040 var maybe_versym: ?[*]elf.Versym = null;
......@@ -45,11 +45,11 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
4545 while (dynv[i] != 0) : (i += 2) {
4646 const p = base +% dynv[i + 1];
4747 switch (dynv[i]) {
48 elf.DT_STRTAB => maybe_strings = @as([*]u8, @ptrFromInt(p)),
49 elf.DT_SYMTAB => maybe_syms = @as([*]elf.Sym, @ptrFromInt(p)),
50 elf.DT_HASH => maybe_hashtab = @as([*]linux.Elf_Symndx, @ptrFromInt(p)),
51 elf.DT_VERSYM => maybe_versym = @as([*]elf.Versym, @ptrFromInt(p)),
52 elf.DT_VERDEF => maybe_verdef = @as(*elf.Verdef, @ptrFromInt(p)),
48 elf.DT_STRTAB => maybe_strings = @ptrFromInt(p),
49 elf.DT_SYMTAB => maybe_syms = @ptrFromInt(p),
50 elf.DT_HASH => maybe_hashtab = @ptrFromInt(p),
51 elf.DT_VERSYM => maybe_versym = @ptrFromInt(p),
52 elf.DT_VERDEF => maybe_verdef = @ptrFromInt(p),
5353 else => {},
5454 }
5555 }
......@@ -80,7 +80,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
8080 return 0;
8181}
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 {
8484 var def = def_arg;
8585 const vsym_index = vsym_arg.VERSION;
8686 while (true) {
......@@ -89,6 +89,5 @@ fn checkver(def_arg: *elf.Verdef, vsym_arg: elf.Versym, vername: []const u8, str
8989 def = @ptrFromInt(@intFromPtr(def) + def.next);
9090 }
9191 const aux: *elf.Verdaux = @ptrFromInt(@intFromPtr(def) + def.aux);
92 const vda_name: [*:0]u8 = @ptrCast(strings + aux.name);
93 return mem.eql(u8, vername, mem.sliceTo(vda_name, 0));
92 return mem.eql(u8, vername, mem.sliceTo(strings + aux.name, 0));
9493}