authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-04-20 23:35:37+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-04-20 23:36:42+02:00
logbc46a4d51e8e95a0c0b9b7766c240d5d9d774941
treec4ececad09df3cc1c38299cfc2d80fbfb85d962a
parent66253e5b5152c6fa59e285badd13250e05de47bb

link/elf: create .comment section for build-lib and no-llvm


2 files changed, 9 insertions(+), 19 deletions(-)

src/link/Elf.zig+3
...@@ -1342,6 +1342,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node)...@@ -1342,6 +1342,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node)
1342 try self.addCommentString();1342 try self.addCommentString();
1343 try self.finalizeMergeSections();1343 try self.finalizeMergeSections();
1344 try self.initOutputSections();1344 try self.initOutputSections();
1345 try self.initMergeSections();
1345 try self.addLinkerDefinedSymbols();1346 try self.addLinkerDefinedSymbols();
1346 self.claimUnresolved();1347 self.claimUnresolved();
13471348
...@@ -3419,7 +3420,9 @@ fn initOutputSections(self: *Elf) !void {...@@ -3419,7 +3420,9 @@ fn initOutputSections(self: *Elf) !void {
3419 for (self.objects.items) |index| {3420 for (self.objects.items) |index| {
3420 try self.file(index).?.object.initOutputSections(self);3421 try self.file(index).?.object.initOutputSections(self);
3421 }3422 }
3423}
34223424
3425pub fn initMergeSections(self: *Elf) !void {
3423 for (self.merge_sections.items) |*msec| {3426 for (self.merge_sections.items) |*msec| {
3424 if (msec.subsections.items.len == 0) continue;3427 if (msec.subsections.items.len == 0) continue;
3425 const name = msec.name(self);3428 const name = msec.name(self);
src/link/Elf/relocatable.zig+6-19
...@@ -34,12 +34,16 @@ pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]co...@@ -34,12 +34,16 @@ pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]co
34 // First, we flush relocatable object file generated with our backends.34 // First, we flush relocatable object file generated with our backends.
35 if (elf_file.zigObjectPtr()) |zig_object| {35 if (elf_file.zigObjectPtr()) |zig_object| {
36 zig_object.resolveSymbols(elf_file);36 zig_object.resolveSymbols(elf_file);
37 try elf_file.addCommentString();
38 try elf_file.finalizeMergeSections();
37 zig_object.claimUnresolvedObject(elf_file);39 zig_object.claimUnresolvedObject(elf_file);
3840
41 try elf_file.initMergeSections();
39 try elf_file.initSymtab();42 try elf_file.initSymtab();
40 try elf_file.initShStrtab();43 try elf_file.initShStrtab();
41 try elf_file.sortShdrs();44 try elf_file.sortShdrs();
42 try zig_object.addAtomsToRelaSections(elf_file);45 try zig_object.addAtomsToRelaSections(elf_file);
46 try elf_file.updateMergeSectionSizes();
43 try updateSectionSizes(elf_file);47 try updateSectionSizes(elf_file);
4448
45 try allocateAllocSections(elf_file);49 try allocateAllocSections(elf_file);
...@@ -49,6 +53,7 @@ pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]co...@@ -49,6 +53,7 @@ pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]co
49 state_log.debug("{}", .{elf_file.dumpState()});53 state_log.debug("{}", .{elf_file.dumpState()});
50 }54 }
5155
56 try elf_file.writeMergeSections();
52 try writeSyntheticSections(elf_file);57 try writeSyntheticSections(elf_file);
53 try elf_file.writeShdrTable();58 try elf_file.writeShdrTable();
54 try elf_file.writeElfHeader();59 try elf_file.writeElfHeader();
...@@ -185,6 +190,7 @@ pub fn flushObject(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]const...@@ -185,6 +190,7 @@ pub fn flushObject(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]const
185 claimUnresolved(elf_file);190 claimUnresolved(elf_file);
186191
187 try initSections(elf_file);192 try initSections(elf_file);
193 try elf_file.initMergeSections();
188 try elf_file.sortShdrs();194 try elf_file.sortShdrs();
189 if (elf_file.zigObjectPtr()) |zig_object| {195 if (elf_file.zigObjectPtr()) |zig_object| {
190 try zig_object.addAtomsToRelaSections(elf_file);196 try zig_object.addAtomsToRelaSections(elf_file);
...@@ -280,25 +286,6 @@ fn initSections(elf_file: *Elf) !void {...@@ -280,25 +286,6 @@ fn initSections(elf_file: *Elf) !void {
280 try object.initRelaSections(elf_file);286 try object.initRelaSections(elf_file);
281 }287 }
282288
283 for (elf_file.merge_sections.items) |*msec| {
284 if (msec.subsections.items.len == 0) continue;
285 const name = msec.name(elf_file);
286 const shndx = elf_file.sectionByName(name) orelse try elf_file.addSection(.{
287 .name = name,
288 .type = msec.type,
289 .flags = msec.flags,
290 });
291 msec.output_section_index = shndx;
292
293 var entsize = elf_file.mergeSubsection(msec.subsections.items[0]).entsize;
294 for (msec.subsections.items) |index| {
295 const msub = elf_file.mergeSubsection(index);
296 entsize = @min(entsize, msub.entsize);
297 }
298 const shdr = &elf_file.shdrs.items[shndx];
299 shdr.sh_entsize = entsize;
300 }
301
302 const needs_eh_frame = for (elf_file.objects.items) |index| {289 const needs_eh_frame = for (elf_file.objects.items) |index| {
303 if (elf_file.file(index).?.object.cies.items.len > 0) break true;290 if (elf_file.file(index).?.object.cies.items.len > 0) break true;
304 } else false;291 } else false;