diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-01 23:08:50 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-04 09:09:57 +0100 |
| commit | 3606b5df3f185edd69af823d3cae213e4b93ff39 (patch) | |
| tree | 393bfeef944ad3b311580427e00adeb751046327 /src/link/Elf | |
| parent | ec2671d16b9363ad7f39312552456cf5e449e930 (diff) | |
| download | zig-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.zig | 5 | ||||
| -rw-r--r-- | src/link/Elf/ZigObject.zig | 1 | ||||
| -rw-r--r-- | src/link/Elf/file.zig | 4 |
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); |
