authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-09-23 10:58:02+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-09-23 10:58:02+02:00
log8c232922bdf21d9936db94447da21ac0dd9ec319
tree4f6b54398e61b197a9e24295fcf8d6a0878506be
parentd83a3f1746c81026d1cf0244156513c9b5a2a9f6
parente0acf432482efba4c92029a7dd18037f1607fc27
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #21493 from ziglang/elf-fixes

elf: misc fixes

4 files changed, 15 insertions(+), 17 deletions(-)

src/link/Elf/LinkerDefined.zig+5-4
......@@ -47,7 +47,7 @@ fn newSymbolAssumeCapacity(self: *LinkerDefined, name_off: u32, elf_file: *Elf)
4747 const esym = self.symtab.addOneAssumeCapacity();
4848 esym.* = .{
4949 .st_name = name_off,
50 .st_info = elf.STB_GLOBAL << 4,
50 .st_info = elf.STB_WEAK << 4,
5151 .st_other = @intFromEnum(elf.STV.HIDDEN),
5252 .st_shndx = elf.SHN_ABS,
5353 .st_value = 0,
......@@ -158,7 +158,6 @@ pub fn initStartStopSymbols(self: *LinkerDefined, elf_file: *Elf) !void {
158158 .index = index,
159159 .file = self.index,
160160 }, elf_file);
161 assert(!gop.found_existing);
162161 gop.ref.* = .{ .index = index, .file = self.index };
163162 self.symbols_resolver.appendAssumeCapacity(gop.index);
164163 }
......@@ -255,8 +254,10 @@ pub fn allocateSymbols(self: *LinkerDefined, elf_file: *Elf) void {
255254
256255 // __dso_handle
257256 if (self.dso_handle_index) |index| {
258 const shdr = shdrs[1];
259 allocSymbol(self, index, shdr.sh_addr, 0, elf_file);
257 if (self.resolveSymbol(index, elf_file).file == self.index) {
258 const shdr = shdrs[1];
259 allocSymbol(self, index, shdr.sh_addr, 0, elf_file);
260 }
260261 }
261262
262263 // __GNU_EH_FRAME_HDR
src/link/Elf/Object.zig+5-6
......@@ -524,12 +524,6 @@ pub fn resolveSymbols(self: *Object, elf_file: *Elf) !void {
524524 const first_global = self.first_global orelse return;
525525 for (self.globals(), first_global..) |_, i| {
526526 const esym = self.symtab.items[i];
527 if (esym.st_shndx != elf.SHN_ABS and esym.st_shndx != elf.SHN_COMMON and esym.st_shndx != elf.SHN_UNDEF) {
528 const atom_index = self.atoms_indexes.items[esym.st_shndx];
529 const atom_ptr = self.atom(atom_index) orelse continue;
530 if (!atom_ptr.alive) continue;
531 }
532
533527 const resolv = &self.symbols_resolver.items[i - first_global];
534528 const gop = try elf_file.resolver.getOrPut(gpa, .{
535529 .index = @intCast(i),
......@@ -541,6 +535,11 @@ pub fn resolveSymbols(self: *Object, elf_file: *Elf) !void {
541535 resolv.* = gop.index;
542536
543537 if (esym.st_shndx == elf.SHN_UNDEF) continue;
538 if (esym.st_shndx != elf.SHN_ABS and esym.st_shndx != elf.SHN_COMMON) {
539 const atom_index = self.atoms_indexes.items[esym.st_shndx];
540 const atom_ptr = self.atom(atom_index) orelse continue;
541 if (!atom_ptr.alive) continue;
542 }
544543 if (elf_file.symbol(gop.ref.*) == null) {
545544 gop.ref.* = .{ .index = @intCast(i), .file = self.index };
546545 continue;
src/link/Elf/Symbol.zig-1
......@@ -471,7 +471,6 @@ pub const Extra = struct {
471471 tlsgd: u32 = 0,
472472 gottp: u32 = 0,
473473 tlsdesc: u32 = 0,
474 merge_section: u32 = 0,
475474 trampoline: u32 = 0,
476475};
477476
src/link/Elf/ZigObject.zig+5-6
......@@ -603,12 +603,6 @@ pub fn resolveSymbols(self: *ZigObject, elf_file: *Elf) !void {
603603 const global = &self.symbols.items[index];
604604 const esym = global.elfSym(elf_file);
605605 const shndx = self.symtab.items(.shndx)[global.esym_index];
606 if (esym.st_shndx != elf.SHN_ABS and esym.st_shndx != elf.SHN_COMMON and esym.st_shndx != elf.SHN_UNDEF) {
607 assert(esym.st_shndx == SHN_ATOM);
608 const atom_ptr = self.atom(shndx) orelse continue;
609 if (!atom_ptr.alive) continue;
610 }
611
612606 const resolv = &self.symbols_resolver.items[i];
613607 const gop = try elf_file.resolver.getOrPut(gpa, .{
614608 .index = @intCast(i | global_symbol_bit),
......@@ -620,6 +614,11 @@ pub fn resolveSymbols(self: *ZigObject, elf_file: *Elf) !void {
620614 resolv.* = gop.index;
621615
622616 if (esym.st_shndx == elf.SHN_UNDEF) continue;
617 if (esym.st_shndx != elf.SHN_ABS and esym.st_shndx != elf.SHN_COMMON) {
618 assert(esym.st_shndx == SHN_ATOM);
619 const atom_ptr = self.atom(shndx) orelse continue;
620 if (!atom_ptr.alive) continue;
621 }
623622 if (elf_file.symbol(gop.ref.*) == null) {
624623 gop.ref.* = .{ .index = @intCast(i | global_symbol_bit), .file = self.index };
625624 continue;