| ... | ... | @@ -141,7 +141,7 @@ pub const ElfDynLib = struct { |
| 141 | 141 | strings: [*:0]u8, |
| 142 | 142 | syms: [*]elf.Sym, |
| 143 | 143 | hashtab: [*]posix.Elf_Symndx, |
| 144 | | versym: ?[*]u16, |
| 144 | versym: ?[*]elf.Versym, |
| 145 | 145 | verdef: ?*elf.Verdef, |
| 146 | 146 | memory: []align(mem.page_size) u8, |
| 147 | 147 | |
| ... | ... | @@ -319,7 +319,7 @@ pub const ElfDynLib = struct { |
| 319 | 319 | var maybe_strings: ?[*:0]u8 = null; |
| 320 | 320 | var maybe_syms: ?[*]elf.Sym = null; |
| 321 | 321 | var maybe_hashtab: ?[*]posix.Elf_Symndx = null; |
| 322 | | var maybe_versym: ?[*]u16 = null; |
| 322 | var maybe_versym: ?[*]elf.Versym = null; |
| 323 | 323 | var maybe_verdef: ?*elf.Verdef = null; |
| 324 | 324 | |
| 325 | 325 | { |
| ... | ... | @@ -327,11 +327,11 @@ pub const ElfDynLib = struct { |
| 327 | 327 | while (dynv[i] != 0) : (i += 2) { |
| 328 | 328 | const p = base + dynv[i + 1]; |
| 329 | 329 | 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), |
| 335 | 335 | else => {}, |
| 336 | 336 | } |
| 337 | 337 | } |
| ... | ... | @@ -399,18 +399,16 @@ pub const ElfDynLib = struct { |
| 399 | 399 | } |
| 400 | 400 | }; |
| 401 | 401 | |
| 402 | | fn checkver(def_arg: *elf.Verdef, vsym_arg: i32, vername: []const u8, strings: [*:0]u8) bool { |
| 402 | fn checkver(def_arg: *elf.Verdef, vsym_arg: elf.Versym, vername: []const u8, strings: [*:0]u8) bool { |
| 403 | 403 | var def = def_arg; |
| 404 | | const vsym = @as(u32, @bitCast(vsym_arg)) & 0x7fff; |
| 404 | const vsym_index = vsym_arg.VERSION; |
| 405 | 405 | 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); |
| 411 | 409 | } |
| 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)); |
| 414 | 412 | } |
| 415 | 413 | |
| 416 | 414 | test "ElfDynLib" { |