| author | |
| committer | |
| log | de04a8a1ef0ea37df7c09a997f60a3c1138de124 |
| tree | b8a6c41e3ae10413a19e930bf5c8ab8f27788d13 |
| parent | 49637f537269ed98efb95a82e63ef73f6a9606a9 |
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, |
| 147 | 147 | ||
| ... | @@ -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; |
| 324 | 324 | ||
| 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 | }; |
| 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 | 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 | } |
| 415 | 413 | ||
| 416 | test "ElfDynLib" { | 414 | test "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; |
| 36 | 36 | ||
| 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 | } |
| 82 | 82 | ||
| 83 | fn checkver(def_arg: *elf.Verdef, vsym_arg: elf.Versym, vername: []const u8, strings: [*]u8) bool { | 83 | fn 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 | } |