aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf/Symbol.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-02-13 16:42:28 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-02-13 20:33:01 +0100
commite401930fa862e3b9b3eedc8eb405c501fbf3de30 (patch)
treedad8558d3ccf98880a4c7f8f6ecb443b52a34247 /src/link/Elf/Symbol.zig
parentc22bb3805821d7ffe60e048f1efe362aad703668 (diff)
downloadzig-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.zig15
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) {