authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-07 14:10:26+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-16 19:33:05+02:00
loga748ca3725e606b6c4be1b3101203ff1e4136924
tree514391bff765f9fae122630007974fa19aa3a452
parentc940735c4d091d77594deb15226bbd67cf36cdf2

elf: populate symtab with symbols coming from DSOs


3 files changed, 11 insertions(+), 6 deletions(-)

src/link/Elf.zig+6
......@@ -4877,6 +4877,12 @@ fn updateSymtabSize(self: *Elf) !void {
48774877 sizes.nglobals += object.output_symtab_size.nglobals;
48784878 }
48794879
4880 for (self.shared_objects.items) |index| {
4881 const shared_object = self.file(index).?.shared_object;
4882 shared_object.updateSymtabSize(self);
4883 sizes.nglobals += shared_object.output_symtab_size.nglobals;
4884 }
4885
48804886 if (self.got_section_index) |_| {
48814887 self.got.updateSymtabSize(self);
48824888 sizes.nlocals += self.got.output_symtab_size.nlocals;
src/link/Elf/Atom.zig+1-2
......@@ -479,9 +479,8 @@ fn scanReloc(
479479 try self.reportNoPicError(symbol, rel, elf_file)
480480 else
481481 try self.reportPicError(symbol, rel, elf_file);
482 } else {
483 symbol.flags.needs_copy_rel = true;
484482 }
483 symbol.flags.needs_copy_rel = true;
485484 },
486485
487486 .dyn_copyrel => {
src/link/Elf/Symbol.zig+4-4
......@@ -51,10 +51,10 @@ pub fn isIFunc(symbol: Symbol, elf_file: *Elf) bool {
5151}
5252
5353pub fn @"type"(symbol: Symbol, elf_file: *Elf) u4 {
54 const s_sym = symbol.elfSym(elf_file);
54 const esym = symbol.elfSym(elf_file);
5555 const file_ptr = symbol.file(elf_file).?;
56 if (s_sym.st_type() == elf.STT_GNU_IFUNC and file_ptr == .shared_object) return elf.STT_FUNC;
57 return s_sym.st_type();
56 if (esym.st_type() == elf.STT_GNU_IFUNC and file_ptr == .shared_object) return elf.STT_FUNC;
57 return esym.st_type();
5858}
5959
6060pub fn name(symbol: Symbol, elf_file: *Elf) [:0]const u8 {
......@@ -111,7 +111,7 @@ pub fn gotAddress(symbol: Symbol, elf_file: *Elf) u64 {
111111}
112112
113113pub fn pltGotAddress(symbol: Symbol, elf_file: *Elf) u64 {
114 if (!(symbol.flags.has_plt and symbol.flags.has_got and !symbol.flags.is_canonical)) return 0;
114 if (!(symbol.flags.has_plt and symbol.flags.has_got)) return 0;
115115 const extras = symbol.extra(elf_file).?;
116116 const shdr = elf_file.shdrs.items[elf_file.plt_got_section_index.?];
117117 return shdr.sh_addr + extras.plt_got * 16;