| author | |
| committer | |
| log | d5fdb7315f2f5742c58af547909437401651ffd5 |
| tree | bd9f8e9f3947e83b0c20230d00f79000c2f8fb19 |
| parent | 700644d35dd674c7381c4794d566e0e64f45c174 |
6 files changed, 42 insertions(+), 65 deletions(-)
src/link/Elf/LinkerDefined.zig+2-2| ... | ... | @@ -60,10 +60,10 @@ pub fn updateSymtabSize(self: *LinkerDefined, elf_file: *Elf) !void { |
| 60 | 60 | if (file_ptr.index() != self.index) continue; |
| 61 | 61 | global.flags.output_symtab = true; |
| 62 | 62 | if (global.isLocal(elf_file)) { |
| 63 | try global.setOutputSymtabIndex(self.output_symtab_ctx.nlocals, elf_file); | |
| 63 | try global.addExtra(.{ .symtab = self.output_symtab_ctx.nlocals }, elf_file); | |
| 64 | 64 | self.output_symtab_ctx.nlocals += 1; |
| 65 | 65 | } else { |
| 66 | try global.setOutputSymtabIndex(self.output_symtab_ctx.nglobals, elf_file); | |
| 66 | try global.addExtra(.{ .symtab = self.output_symtab_ctx.nglobals }, elf_file); | |
| 67 | 67 | self.output_symtab_ctx.nglobals += 1; |
| 68 | 68 | } |
| 69 | 69 | self.output_symtab_ctx.strsize += @as(u32, @intCast(global.name(elf_file).len)) + 1; |
src/link/Elf/Object.zig+3-3| ... | ... | @@ -853,7 +853,7 @@ pub fn updateSymtabSize(self: *Object, elf_file: *Elf) !void { |
| 853 | 853 | else => {}, |
| 854 | 854 | } |
| 855 | 855 | local.flags.output_symtab = true; |
| 856 | try local.setOutputSymtabIndex(self.output_symtab_ctx.nlocals, elf_file); | |
| 856 | try local.addExtra(.{ .symtab = self.output_symtab_ctx.nlocals }, elf_file); | |
| 857 | 857 | self.output_symtab_ctx.nlocals += 1; |
| 858 | 858 | self.output_symtab_ctx.strsize += @as(u32, @intCast(local.name(elf_file).len)) + 1; |
| 859 | 859 | } |
| ... | ... | @@ -865,10 +865,10 @@ pub fn updateSymtabSize(self: *Object, elf_file: *Elf) !void { |
| 865 | 865 | if (global.atom(elf_file)) |atom| if (!atom.flags.alive) continue; |
| 866 | 866 | global.flags.output_symtab = true; |
| 867 | 867 | if (global.isLocal(elf_file)) { |
| 868 | try global.setOutputSymtabIndex(self.output_symtab_ctx.nlocals, elf_file); | |
| 868 | try global.addExtra(.{ .symtab = self.output_symtab_ctx.nlocals }, elf_file); | |
| 869 | 869 | self.output_symtab_ctx.nlocals += 1; |
| 870 | 870 | } else { |
| 871 | try global.setOutputSymtabIndex(self.output_symtab_ctx.nglobals, elf_file); | |
| 871 | try global.addExtra(.{ .symtab = self.output_symtab_ctx.nglobals }, elf_file); | |
| 872 | 872 | self.output_symtab_ctx.nglobals += 1; |
| 873 | 873 | } |
| 874 | 874 | self.output_symtab_ctx.strsize += @as(u32, @intCast(global.name(elf_file).len)) + 1; |
src/link/Elf/SharedObject.zig+1-1| ... | ... | @@ -269,7 +269,7 @@ pub fn updateSymtabSize(self: *SharedObject, elf_file: *Elf) !void { |
| 269 | 269 | if (file_ptr.index() != self.index) continue; |
| 270 | 270 | if (global.isLocal(elf_file)) continue; |
| 271 | 271 | global.flags.output_symtab = true; |
| 272 | try global.setOutputSymtabIndex(self.output_symtab_ctx.nglobals, elf_file); | |
| 272 | try global.addExtra(.{ .symtab = self.output_symtab_ctx.nglobals }, elf_file); | |
| 273 | 273 | self.output_symtab_ctx.nglobals += 1; |
| 274 | 274 | self.output_symtab_ctx.strsize += @as(u32, @intCast(global.name(elf_file).len)) + 1; |
| 275 | 275 | } |
src/link/Elf/Symbol.zig+24-10| ... | ... | @@ -143,14 +143,6 @@ pub fn outputSymtabIndex(symbol: Symbol, elf_file: *Elf) ?u32 { |
| 143 | 143 | return if (symbol.isLocal(elf_file)) idx + symtab_ctx.ilocal else idx + symtab_ctx.iglobal; |
| 144 | 144 | } |
| 145 | 145 | |
| 146 | pub fn setOutputSymtabIndex(symbol: *Symbol, index: u32, elf_file: *Elf) !void { | |
| 147 | if (symbol.extra(elf_file)) |extras| { | |
| 148 | var new_extras = extras; | |
| 149 | new_extras.symtab = index; | |
| 150 | symbol.setExtra(new_extras, elf_file); | |
| 151 | } else try symbol.addExtra(.{ .symtab = index }, elf_file); | |
| 152 | } | |
| 153 | ||
| 154 | 146 | pub fn gotAddress(symbol: Symbol, elf_file: *Elf) u64 { |
| 155 | 147 | if (!symbol.flags.has_got) return 0; |
| 156 | 148 | const extras = symbol.extra(elf_file).?; |
| ... | ... | @@ -240,8 +232,30 @@ pub fn dsoAlignment(symbol: Symbol, elf_file: *Elf) !u64 { |
| 240 | 232 | @min(alignment, try std.math.powi(u64, 2, @ctz(esym.st_value))); |
| 241 | 233 | } |
| 242 | 234 | |
| 243 | pub fn addExtra(symbol: *Symbol, extras: Extra, elf_file: *Elf) !void { | |
| 244 | symbol.extra_index = try elf_file.addSymbolExtra(extras); | |
| 235 | const AddExtraOpts = struct { | |
| 236 | got: ?u32 = null, | |
| 237 | plt: ?u32 = null, | |
| 238 | plt_got: ?u32 = null, | |
| 239 | dynamic: ?u32 = null, | |
| 240 | symtab: ?u32 = null, | |
| 241 | copy_rel: ?u32 = null, | |
| 242 | tlsgd: ?u32 = null, | |
| 243 | gottp: ?u32 = null, | |
| 244 | tlsdesc: ?u32 = null, | |
| 245 | zig_got: ?u32 = null, | |
| 246 | }; | |
| 247 | ||
| 248 | pub fn addExtra(symbol: *Symbol, opts: AddExtraOpts, elf_file: *Elf) !void { | |
| 249 | if (symbol.extra(elf_file) == null) { | |
| 250 | symbol.extra_index = try elf_file.addSymbolExtra(.{}); | |
| 251 | } | |
| 252 | var extras = symbol.extra(elf_file).?; | |
| 253 | inline for (@typeInfo(@TypeOf(opts)).Struct.fields) |field| { | |
| 254 | if (@field(opts, field.name)) |x| { | |
| 255 | @field(extras, field.name) = x; | |
| 256 | } | |
| 257 | } | |
| 258 | symbol.setExtra(extras, elf_file); | |
| 245 | 259 | } |
| 246 | 260 | |
| 247 | 261 | pub fn extra(symbol: Symbol, elf_file: *Elf) ?Extra { |
src/link/Elf/ZigObject.zig+3-3| ... | ... | @@ -566,7 +566,7 @@ pub fn updateSymtabSize(self: *ZigObject, elf_file: *Elf) !void { |
| 566 | 566 | else => {}, |
| 567 | 567 | } |
| 568 | 568 | local.flags.output_symtab = true; |
| 569 | try local.setOutputSymtabIndex(self.output_symtab_ctx.nlocals, elf_file); | |
| 569 | try local.addExtra(.{ .symtab = self.output_symtab_ctx.nlocals }, elf_file); | |
| 570 | 570 | self.output_symtab_ctx.nlocals += 1; |
| 571 | 571 | self.output_symtab_ctx.strsize += @as(u32, @intCast(local.name(elf_file).len)) + 1; |
| 572 | 572 | } |
| ... | ... | @@ -578,10 +578,10 @@ pub fn updateSymtabSize(self: *ZigObject, elf_file: *Elf) !void { |
| 578 | 578 | if (global.atom(elf_file)) |atom| if (!atom.flags.alive) continue; |
| 579 | 579 | global.flags.output_symtab = true; |
| 580 | 580 | if (global.isLocal(elf_file)) { |
| 581 | try global.setOutputSymtabIndex(self.output_symtab_ctx.nlocals, elf_file); | |
| 581 | try global.addExtra(.{ .symtab = self.output_symtab_ctx.nlocals }, elf_file); | |
| 582 | 582 | self.output_symtab_ctx.nlocals += 1; |
| 583 | 583 | } else { |
| 584 | try global.setOutputSymtabIndex(self.output_symtab_ctx.nglobals, elf_file); | |
| 584 | try global.addExtra(.{ .symtab = self.output_symtab_ctx.nglobals }, elf_file); | |
| 585 | 585 | self.output_symtab_ctx.nglobals += 1; |
| 586 | 586 | } |
| 587 | 587 | self.output_symtab_ctx.strsize += @as(u32, @intCast(global.name(elf_file).len)) + 1; |
src/link/Elf/synthetic_sections.zig+9-46| ... | ... | @@ -259,11 +259,7 @@ pub const ZigGotSection = struct { |
| 259 | 259 | if (elf_file.isEffectivelyDynLib() or (elf_file.base.isExe() and comp.config.pie)) { |
| 260 | 260 | zig_got.flags.needs_rela = true; |
| 261 | 261 | } |
| 262 | if (symbol.extra(elf_file)) |extra| { | |
| 263 | var new_extra = extra; | |
| 264 | new_extra.zig_got = index; | |
| 265 | symbol.setExtra(new_extra, elf_file); | |
| 266 | } else try symbol.addExtra(.{ .zig_got = index }, elf_file); | |
| 262 | try symbol.addExtra(.{ .zig_got = index }, elf_file); | |
| 267 | 263 | return index; |
| 268 | 264 | } |
| 269 | 265 | |
| ... | ... | @@ -499,11 +495,7 @@ pub const GotSection = struct { |
| 499 | 495 | { |
| 500 | 496 | got.flags.needs_rela = true; |
| 501 | 497 | } |
| 502 | if (symbol.extra(elf_file)) |extra| { | |
| 503 | var new_extra = extra; | |
| 504 | new_extra.got = index; | |
| 505 | symbol.setExtra(new_extra, elf_file); | |
| 506 | } else try symbol.addExtra(.{ .got = index }, elf_file); | |
| 498 | try symbol.addExtra(.{ .got = index }, elf_file); | |
| 507 | 499 | return index; |
| 508 | 500 | } |
| 509 | 501 | |
| ... | ... | @@ -529,11 +521,7 @@ pub const GotSection = struct { |
| 529 | 521 | const symbol = elf_file.symbol(sym_index); |
| 530 | 522 | symbol.flags.has_tlsgd = true; |
| 531 | 523 | if (symbol.flags.import or elf_file.isEffectivelyDynLib()) got.flags.needs_rela = true; |
| 532 | if (symbol.extra(elf_file)) |extra| { | |
| 533 | var new_extra = extra; | |
| 534 | new_extra.tlsgd = index; | |
| 535 | symbol.setExtra(new_extra, elf_file); | |
| 536 | } else try symbol.addExtra(.{ .tlsgd = index }, elf_file); | |
| 524 | try symbol.addExtra(.{ .tlsgd = index }, elf_file); | |
| 537 | 525 | } |
| 538 | 526 | |
| 539 | 527 | pub fn addGotTpSymbol(got: *GotSection, sym_index: Symbol.Index, elf_file: *Elf) !void { |
| ... | ... | @@ -546,11 +534,7 @@ pub const GotSection = struct { |
| 546 | 534 | const symbol = elf_file.symbol(sym_index); |
| 547 | 535 | symbol.flags.has_gottp = true; |
| 548 | 536 | if (symbol.flags.import or elf_file.isEffectivelyDynLib()) got.flags.needs_rela = true; |
| 549 | if (symbol.extra(elf_file)) |extra| { | |
| 550 | var new_extra = extra; | |
| 551 | new_extra.gottp = index; | |
| 552 | symbol.setExtra(new_extra, elf_file); | |
| 553 | } else try symbol.addExtra(.{ .gottp = index }, elf_file); | |
| 537 | try symbol.addExtra(.{ .gottp = index }, elf_file); | |
| 554 | 538 | } |
| 555 | 539 | |
| 556 | 540 | pub fn addTlsDescSymbol(got: *GotSection, sym_index: Symbol.Index, elf_file: *Elf) !void { |
| ... | ... | @@ -563,11 +547,7 @@ pub const GotSection = struct { |
| 563 | 547 | const symbol = elf_file.symbol(sym_index); |
| 564 | 548 | symbol.flags.has_tlsdesc = true; |
| 565 | 549 | got.flags.needs_rela = true; |
| 566 | if (symbol.extra(elf_file)) |extra| { | |
| 567 | var new_extra = extra; | |
| 568 | new_extra.tlsdesc = index; | |
| 569 | symbol.setExtra(new_extra, elf_file); | |
| 570 | } else try symbol.addExtra(.{ .tlsdesc = index }, elf_file); | |
| 550 | try symbol.addExtra(.{ .tlsdesc = index }, elf_file); | |
| 571 | 551 | } |
| 572 | 552 | |
| 573 | 553 | pub fn size(got: GotSection, elf_file: *Elf) usize { |
| ... | ... | @@ -877,11 +857,7 @@ pub const PltSection = struct { |
| 877 | 857 | const index = @as(u32, @intCast(plt.symbols.items.len)); |
| 878 | 858 | const symbol = elf_file.symbol(sym_index); |
| 879 | 859 | symbol.flags.has_plt = true; |
| 880 | if (symbol.extra(elf_file)) |extra| { | |
| 881 | var new_extra = extra; | |
| 882 | new_extra.plt = index; | |
| 883 | symbol.setExtra(new_extra, elf_file); | |
| 884 | } else try symbol.addExtra(.{ .plt = index }, elf_file); | |
| 860 | try symbol.addExtra(.{ .plt = index }, elf_file); | |
| 885 | 861 | try plt.symbols.append(gpa, sym_index); |
| 886 | 862 | } |
| 887 | 863 | |
| ... | ... | @@ -1132,11 +1108,7 @@ pub const PltGotSection = struct { |
| 1132 | 1108 | const symbol = elf_file.symbol(sym_index); |
| 1133 | 1109 | symbol.flags.has_plt = true; |
| 1134 | 1110 | symbol.flags.has_got = true; |
| 1135 | if (symbol.extra(elf_file)) |extra| { | |
| 1136 | var new_extra = extra; | |
| 1137 | new_extra.plt_got = index; | |
| 1138 | symbol.setExtra(new_extra, elf_file); | |
| 1139 | } else try symbol.addExtra(.{ .plt_got = index }, elf_file); | |
| 1111 | try symbol.addExtra(.{ .plt_got = index }, elf_file); | |
| 1140 | 1112 | try plt_got.symbols.append(gpa, sym_index); |
| 1141 | 1113 | } |
| 1142 | 1114 | |
| ... | ... | @@ -1248,12 +1220,7 @@ pub const CopyRelSection = struct { |
| 1248 | 1220 | symbol.flags.@"export" = true; |
| 1249 | 1221 | symbol.flags.has_copy_rel = true; |
| 1250 | 1222 | symbol.flags.weak = false; |
| 1251 | ||
| 1252 | if (symbol.extra(elf_file)) |extra| { | |
| 1253 | var new_extra = extra; | |
| 1254 | new_extra.copy_rel = index; | |
| 1255 | symbol.setExtra(new_extra, elf_file); | |
| 1256 | } else try symbol.addExtra(.{ .copy_rel = index }, elf_file); | |
| 1223 | try symbol.addExtra(.{ .copy_rel = index }, elf_file); | |
| 1257 | 1224 | try copy_rel.symbols.append(gpa, sym_index); |
| 1258 | 1225 | |
| 1259 | 1226 | const shared_object = symbol.file(elf_file).?.shared_object; |
| ... | ... | @@ -1335,11 +1302,7 @@ pub const DynsymSection = struct { |
| 1335 | 1302 | const index = @as(u32, @intCast(dynsym.entries.items.len + 1)); |
| 1336 | 1303 | const sym = elf_file.symbol(sym_index); |
| 1337 | 1304 | sym.flags.has_dynamic = true; |
| 1338 | if (sym.extra(elf_file)) |extra| { | |
| 1339 | var new_extra = extra; | |
| 1340 | new_extra.dynamic = index; | |
| 1341 | sym.setExtra(new_extra, elf_file); | |
| 1342 | } else try sym.addExtra(.{ .dynamic = index }, elf_file); | |
| 1305 | try sym.addExtra(.{ .dynamic = index }, elf_file); | |
| 1343 | 1306 | const off = try elf_file.insertDynString(sym.name(elf_file)); |
| 1344 | 1307 | try dynsym.entries.append(gpa, .{ .symbol_index = sym_index, .off = off }); |
| 1345 | 1308 | } |