authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-02 18:32:07+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-07 10:21:02+02:00
log8ca809d928219950ce606b4f8a18ccb52e644407
treea9a79983468181184c75dcbe168e8cca0956a746
parent41e9b8b6c84a1787ffa647fc42980dcce4942b7d

elf: move getStartStopBasename into Object


3 files changed, 14 insertions(+), 12 deletions(-)

src/link/Elf.zig-8
......@@ -5252,14 +5252,6 @@ pub fn isCIdentifier(name: []const u8) bool {
52525252 return true;
52535253}
52545254
5255pub fn getStartStopBasename(self: *Elf, shdr: elf.Elf64_Shdr) ?[]const u8 {
5256 const name = self.getShString(shdr.sh_name);
5257 if (shdr.sh_flags & elf.SHF_ALLOC != 0 and name.len > 0) {
5258 if (isCIdentifier(name)) return name;
5259 }
5260 return null;
5261}
5262
52635255pub fn addThunk(self: *Elf) !Thunk.Index {
52645256 const index = @as(Thunk.Index, @intCast(self.thunks.items.len));
52655257 const th = try self.thunks.addOne(self.base.comp.gpa);
src/link/Elf/LinkerDefined.zig+6-4
......@@ -95,8 +95,9 @@ pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void {
9595
9696 var start_stop_count: usize = 0;
9797 for (elf_file.objects.items) |index| {
98 for (elf_file.file(index).?.object.shdrs.items) |shdr| {
99 if (elf_file.getStartStopBasename(shdr)) |_| {
98 const object = elf_file.file(index).?.object;
99 for (object.shdrs.items) |shdr| {
100 if (object.getStartStopBasename(shdr)) |_| {
100101 start_stop_count += 2; // __start_, __stop_
101102 }
102103 }
......@@ -140,8 +141,9 @@ pub fn initSymbols(self: *LinkerDefined, elf_file: *Elf) !void {
140141 }
141142
142143 for (elf_file.objects.items) |index| {
143 for (elf_file.file(index).?.object.shdrs.items) |shdr| {
144 if (elf_file.getStartStopBasename(shdr)) |name| {
144 const object = elf_file.file(index).?.object;
145 for (object.shdrs.items) |shdr| {
146 if (object.getStartStopBasename(shdr)) |name| {
145147 const start_name = try std.fmt.allocPrintZ(gpa, "__start_{s}", .{name});
146148 defer gpa.free(start_name);
147149 const stop_name = try std.fmt.allocPrintZ(gpa, "__stop_{s}", .{name});
src/link/Elf/Object.zig+8
......@@ -1444,6 +1444,14 @@ pub fn comdatGroup(self: *Object, index: Elf.ComdatGroup.Index) *Elf.ComdatGroup
14441444 return &self.comdat_groups.items[index];
14451445}
14461446
1447pub fn getStartStopBasename(self: Object, shdr: elf.Elf64_Shdr) ?[]const u8 {
1448 const name = self.getString(shdr.sh_name);
1449 if (shdr.sh_flags & elf.SHF_ALLOC != 0 and name.len > 0) {
1450 if (Elf.isCIdentifier(name)) return name;
1451 }
1452 return null;
1453}
1454
14471455pub fn format(
14481456 self: *Object,
14491457 comptime unused_fmt_string: []const u8,