aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-11-01 23:08:50 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-11-04 09:09:57 +0100
commit3606b5df3f185edd69af823d3cae213e4b93ff39 (patch)
tree393bfeef944ad3b311580427e00adeb751046327 /src/link/Elf
parentec2671d16b9363ad7f39312552456cf5e449e930 (diff)
downloadzig-3606b5df3f185edd69af823d3cae213e4b93ff39.tar.gz
zig-3606b5df3f185edd69af823d3cae213e4b93ff39.zip
elf: improve Symbol to handle emitting relocatable object files
Diffstat (limited to 'src/link/Elf')
-rw-r--r--src/link/Elf/Symbol.zig5
-rw-r--r--src/link/Elf/ZigObject.zig1
-rw-r--r--src/link/Elf/file.zig4
3 files changed, 6 insertions, 4 deletions
diff --git a/src/link/Elf/Symbol.zig b/src/link/Elf/Symbol.zig
index b75c458e68..01a8129b32 100644
--- a/src/link/Elf/Symbol.zig
+++ b/src/link/Elf/Symbol.zig
@@ -42,7 +42,8 @@ pub fn outputShndx(symbol: Symbol) ?u16 {
return symbol.output_section_index;
}
-pub fn isLocal(symbol: Symbol) bool {
+pub fn isLocal(symbol: Symbol, elf_file: *Elf) bool {
+ if (elf_file.isObject()) return symbol.elfSym(elf_file).st_bind() == elf.STB_LOCAL;
return !(symbol.flags.import or symbol.flags.@"export");
}
@@ -208,7 +209,7 @@ pub fn setOutputSym(symbol: Symbol, elf_file: *Elf, out: *elf.Elf64_Sym) void {
const esym = symbol.elfSym(elf_file);
const st_type = symbol.type(elf_file);
const st_bind: u8 = blk: {
- if (symbol.isLocal()) break :blk 0;
+ if (symbol.isLocal(elf_file)) break :blk 0;
if (symbol.flags.weak) break :blk elf.STB_WEAK;
if (file_ptr == .shared_object) break :blk elf.STB_GLOBAL;
break :blk esym.st_bind();
diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig
index 2b4872275c..8089dda565 100644
--- a/src/link/Elf/ZigObject.zig
+++ b/src/link/Elf/ZigObject.zig
@@ -1192,6 +1192,7 @@ pub fn updateExports(
global_esym.st_shndx = esym.st_shndx;
global_esym.st_info = (stb_bits << 4) | stt_bits;
global_esym.st_name = name_off;
+ global_esym.st_size = esym.st_size;
self.global_esyms.items(.shndx)[actual_esym_index] = esym_shndx;
}
}
diff --git a/src/link/Elf/file.zig b/src/link/Elf/file.zig
index a401203ba7..84d8ba396e 100644
--- a/src/link/Elf/file.zig
+++ b/src/link/Elf/file.zig
@@ -150,7 +150,7 @@ pub const File = union(enum) {
if (file_ptr.index() != file.index()) continue;
if (global.atom(elf_file)) |atom| if (!atom.flags.alive) continue;
global.flags.output_symtab = true;
- if (global.isLocal()) {
+ if (global.isLocal(elf_file)) {
output_symtab_size.nlocals += 1;
} else {
output_symtab_size.nglobals += 1;
@@ -181,7 +181,7 @@ pub const File = union(enum) {
const st_name = @as(u32, @intCast(elf_file.strtab.items.len));
elf_file.strtab.appendSliceAssumeCapacity(global.name(elf_file));
elf_file.strtab.appendAssumeCapacity(0);
- if (global.isLocal()) {
+ if (global.isLocal(elf_file)) {
const out_sym = &elf_file.symtab.items[ilocal];
out_sym.st_name = st_name;
global.setOutputSym(elf_file, out_sym);