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 {...@@ -4877,6 +4877,12 @@ fn updateSymtabSize(self: *Elf) !void {
4877 sizes.nglobals += object.output_symtab_size.nglobals;4877 sizes.nglobals += object.output_symtab_size.nglobals;
4878 }4878 }
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
4880 if (self.got_section_index) |_| {4886 if (self.got_section_index) |_| {
4881 self.got.updateSymtabSize(self);4887 self.got.updateSymtabSize(self);
4882 sizes.nlocals += self.got.output_symtab_size.nlocals;4888 sizes.nlocals += self.got.output_symtab_size.nlocals;
src/link/Elf/Atom.zig+1-2
...@@ -479,9 +479,8 @@ fn scanReloc(...@@ -479,9 +479,8 @@ fn scanReloc(
479 try self.reportNoPicError(symbol, rel, elf_file)479 try self.reportNoPicError(symbol, rel, elf_file)
480 else480 else
481 try self.reportPicError(symbol, rel, elf_file);481 try self.reportPicError(symbol, rel, elf_file);
482 } else {
483 symbol.flags.needs_copy_rel = true;
484 }482 }
483 symbol.flags.needs_copy_rel = true;
485 },484 },
486485
487 .dyn_copyrel => {486 .dyn_copyrel => {
src/link/Elf/Symbol.zig+4-4
...@@ -51,10 +51,10 @@ pub fn isIFunc(symbol: Symbol, elf_file: *Elf) bool {...@@ -51,10 +51,10 @@ pub fn isIFunc(symbol: Symbol, elf_file: *Elf) bool {
51}51}
5252
53pub fn @"type"(symbol: Symbol, elf_file: *Elf) u4 {53pub fn @"type"(symbol: Symbol, elf_file: *Elf) u4 {
54 const s_sym = symbol.elfSym(elf_file);54 const esym = symbol.elfSym(elf_file);
55 const file_ptr = symbol.file(elf_file).?;55 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;56 if (esym.st_type() == elf.STT_GNU_IFUNC and file_ptr == .shared_object) return elf.STT_FUNC;
57 return s_sym.st_type();57 return esym.st_type();
58}58}
5959
60pub fn name(symbol: Symbol, elf_file: *Elf) [:0]const u8 {60pub fn name(symbol: Symbol, elf_file: *Elf) [:0]const u8 {
...@@ -111,7 +111,7 @@ pub fn gotAddress(symbol: Symbol, elf_file: *Elf) u64 {...@@ -111,7 +111,7 @@ pub fn gotAddress(symbol: Symbol, elf_file: *Elf) u64 {
111}111}
112112
113pub fn pltGotAddress(symbol: Symbol, elf_file: *Elf) u64 {113pub 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;
115 const extras = symbol.extra(elf_file).?;115 const extras = symbol.extra(elf_file).?;
116 const shdr = elf_file.shdrs.items[elf_file.plt_got_section_index.?];116 const shdr = elf_file.shdrs.items[elf_file.plt_got_section_index.?];
117 return shdr.sh_addr + extras.plt_got * 16;117 return shdr.sh_addr + extras.plt_got * 16;