diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-02-13 16:42:28 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-02-13 20:33:01 +0100 |
| commit | e401930fa862e3b9b3eedc8eb405c501fbf3de30 (patch) | |
| tree | dad8558d3ccf98880a4c7f8f6ecb443b52a34247 /src/link/Elf/Symbol.zig | |
| parent | c22bb3805821d7ffe60e048f1efe362aad703668 (diff) | |
| download | zig-e401930fa862e3b9b3eedc8eb405c501fbf3de30.tar.gz zig-e401930fa862e3b9b3eedc8eb405c501fbf3de30.zip | |
elf: store relative offsets in atom and symbol
Diffstat (limited to 'src/link/Elf/Symbol.zig')
| -rw-r--r-- | src/link/Elf/Symbol.zig | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/link/Elf/Symbol.zig b/src/link/Elf/Symbol.zig index 7c7d3fd17c..b2eee739ed 100644 --- a/src/link/Elf/Symbol.zig +++ b/src/link/Elf/Symbol.zig @@ -104,6 +104,9 @@ pub fn address(symbol: Symbol, opts: struct { plt: bool = true }, elf_file: *Elf // Lazy-bound function it is! return symbol.pltAddress(elf_file); } + if (symbol.atom(elf_file)) |atom_ptr| { + return atom_ptr.address(elf_file) + symbol.value; + } return symbol.value; } @@ -247,11 +250,11 @@ pub fn setOutputSym(symbol: Symbol, elf_file: *Elf, out: *elf.Elf64_Sym) void { if (symbol.flags.is_canonical) break :blk symbol.address(.{}, elf_file); break :blk 0; } - if (st_shndx == elf.SHN_ABS or st_shndx == elf.SHN_COMMON) break :blk symbol.value; + if (st_shndx == elf.SHN_ABS or st_shndx == elf.SHN_COMMON) break :blk symbol.address(.{ .plt = false }, elf_file); const shdr = &elf_file.shdrs.items[st_shndx]; if (shdr.sh_flags & elf.SHF_TLS != 0 and file_ptr != .linker_defined) - break :blk symbol.value - elf_file.tlsAddress(); - break :blk symbol.value; + break :blk symbol.address(.{ .plt = false }, elf_file) - elf_file.tlsAddress(); + break :blk symbol.address(.{ .plt = false }, elf_file); }; out.st_info = (st_bind << 4) | st_type; out.st_other = esym.st_other; @@ -323,7 +326,11 @@ fn format2( _ = options; _ = unused_fmt_string; const symbol = ctx.symbol; - try writer.print("%{d} : {s} : @{x}", .{ symbol.esym_index, symbol.fmtName(ctx.elf_file), symbol.value }); + try writer.print("%{d} : {s} : @{x}", .{ + symbol.esym_index, + symbol.fmtName(ctx.elf_file), + symbol.address(.{}, ctx.elf_file), + }); if (symbol.file(ctx.elf_file)) |file_ptr| { if (symbol.isAbs(ctx.elf_file)) { if (symbol.elfSym(ctx.elf_file).st_shndx == elf.SHN_UNDEF) { |
