| ... | ... | @@ -137,6 +137,9 @@ node_global_symbols: std.array_hash_map.Auto(MappedFile.Node.Index, Symbol.Globa |
| 137 | 137 | /// See the definition of `DsoGlobals`. |
| 138 | 138 | dso_globals: DsoGlobals, |
| 139 | 139 | |
| 140 | /// Contains all defined global symbols that do not have a node. |
| 141 | nodeless_globals: std.array_hash_map.Auto(Symbol.Global.Index, void), |
| 142 | |
| 140 | 143 | // These are needed to find local symbols when a nodeless section moves. |
| 141 | 144 | bss_inputs: std.ArrayList(Node.InputIndex), |
| 142 | 145 | tbss_inputs: std.ArrayList(Node.InputIndex), |
| ... | ... | @@ -2744,6 +2747,7 @@ fn addGlobalSymbol(elf: *Elf, opts: Symbol.Global.AddOptions) (error{ |
| 2744 | 2747 | try elf.globals.ensureUnusedCapacity(gpa, 1); |
| 2745 | 2748 | try elf.globals_by_name.ensureUnusedCapacity(gpa, 1); |
| 2746 | 2749 | try elf.node_global_symbols.ensureUnusedCapacity(gpa, 1); |
| 2750 | try elf.nodeless_globals.ensureUnusedCapacity(gpa, 1); |
| 2747 | 2751 | |
| 2748 | 2752 | try Section.Index.symtab.node(elf).ensureMinimumSize(gpa, &elf.mf, switch (elf.shdrPtr(.symtab)) { |
| 2749 | 2753 | inline else => |shdr, class| elf.targetLoad(&shdr.size) + @sizeOf(class.ElfN().Sym), |
| ... | ... | @@ -2911,6 +2915,10 @@ fn addGlobalSymbol(elf: *Elf, opts: Symbol.Global.AddOptions) (error{ |
| 2911 | 2915 | old_head_ptr.prev_in_node = .wrap(gsi); |
| 2912 | 2916 | } |
| 2913 | 2917 | |
| 2918 | if (opts.node == .none and opts.shndx != .UNDEF) { |
| 2919 | elf.nodeless_globals.putAssumeCapacity(gsi, {}); |
| 2920 | } |
| 2921 | |
| 2914 | 2922 | if (force_local_bind) { |
| 2915 | 2923 | elf.moveDemotedGlobal(gsi); |
| 2916 | 2924 | } |
| ... | ... | @@ -3373,6 +3381,11 @@ fn setGlobalSymbolValue(elf: *Elf, gsi: Symbol.Global.Index, new: struct { |
| 3373 | 3381 | assert(global_ptr.prev_in_node == .none); |
| 3374 | 3382 | } |
| 3375 | 3383 | |
| 3384 | _ = elf.nodeless_globals.swapRemove(gsi); |
| 3385 | if (new.node == .none) { |
| 3386 | try elf.nodeless_globals.put(elf.base.comp.gpa, gsi, {}); |
| 3387 | } |
| 3388 | |
| 3376 | 3389 | global_ptr.symtab_index.ptr(elf).node = new.node; |
| 3377 | 3390 | |
| 3378 | 3391 | const old_head: Symbol.Global.Index.Optional = old_head: { |
| ... | ... | @@ -4770,6 +4783,7 @@ fn create( |
| 4770 | 4783 | .symbols = .empty, |
| 4771 | 4784 | .default_sym_vers = .empty, |
| 4772 | 4785 | }, |
| 4786 | .nodeless_globals = .empty, |
| 4773 | 4787 | .bss_inputs = .empty, |
| 4774 | 4788 | .tbss_inputs = .empty, |
| 4775 | 4789 | .shstrtab = .{ .map = .empty }, |
| ... | ... | @@ -4854,6 +4868,7 @@ pub fn deinit(elf: *Elf) void { |
| 4854 | 4868 | elf.dso_globals.string_bytes.deinit(gpa); |
| 4855 | 4869 | elf.dso_globals.symbols.deinit(gpa); |
| 4856 | 4870 | elf.dso_globals.default_sym_vers.deinit(gpa); |
| 4871 | elf.nodeless_globals.deinit(gpa); |
| 4857 | 4872 | elf.bss_inputs.deinit(gpa); |
| 4858 | 4873 | elf.tbss_inputs.deinit(gpa); |
| 4859 | 4874 | elf.shstrtab.map.deinit(gpa); |
| ... | ... | @@ -11627,15 +11642,19 @@ fn updateNobitsAddress( |
| 11627 | 11642 | |
| 11628 | 11643 | // Update globals. |
| 11629 | 11644 | // Since nobits sections have no nodes, we can't just iterate over `node_global_symbols`, |
| 11630 | | // so instead filter manually. |
| 11631 | | for (elf.globals.items, 0..) |global, global_index| { |
| 11632 | | if (global.symtab_index.ptr(elf).node != .none) continue; |
| 11633 | | const symbol: Symbol.Id = .global(@fromBackingInt(@intCast(global_index))); |
| 11634 | | const symbol_shndx = switch (elf.symPtr(global.symtab_index)) { |
| 11645 | // so instead filter manually through nodeless symbols. |
| 11646 | for (elf.nodeless_globals.keys()) |gsi| { |
| 11647 | const symbol: Symbol.Id = .global(gsi); |
| 11648 | |
| 11649 | const symbol_shndx = switch (elf.symPtr(symbol.index(elf))) { |
| 11635 | 11650 | inline else => |sym| elf.targetLoad(&sym.shndx), |
| 11636 | 11651 | }; |
| 11637 | 11652 | if (symbol_shndx != expected_shndx) continue; |
| 11638 | | symbol.flushMoved(elf, symbol.value(elf) - old_symbol_base + new_symbol_base); |
| 11653 | |
| 11654 | symbol.flushMoved( |
| 11655 | elf, |
| 11656 | symbol.value(elf) - old_symbol_base + new_symbol_base, |
| 11657 | ); |
| 11639 | 11658 | } |
| 11640 | 11659 | |
| 11641 | 11660 | Symbol.Id.local(shndx.get(elf).lsi).flushMoved( |