Commit bc46a4d51e

Jakub Konka <kubkon@jakubkonka.com>
2024-04-20 23:35:37
link/elf: create .comment section for build-lib and no-llvm
1 parent 66253e5
Changed files (2)
src/link/Elf/relocatable.zig
@@ -34,12 +34,16 @@ pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]co
     // First, we flush relocatable object file generated with our backends.
     if (elf_file.zigObjectPtr()) |zig_object| {
         zig_object.resolveSymbols(elf_file);
+        try elf_file.addCommentString();
+        try elf_file.finalizeMergeSections();
         zig_object.claimUnresolvedObject(elf_file);
 
+        try elf_file.initMergeSections();
         try elf_file.initSymtab();
         try elf_file.initShStrtab();
         try elf_file.sortShdrs();
         try zig_object.addAtomsToRelaSections(elf_file);
+        try elf_file.updateMergeSectionSizes();
         try updateSectionSizes(elf_file);
 
         try allocateAllocSections(elf_file);
@@ -49,6 +53,7 @@ pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]co
             state_log.debug("{}", .{elf_file.dumpState()});
         }
 
+        try elf_file.writeMergeSections();
         try writeSyntheticSections(elf_file);
         try elf_file.writeShdrTable();
         try elf_file.writeElfHeader();
@@ -185,6 +190,7 @@ pub fn flushObject(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]const
     claimUnresolved(elf_file);
 
     try initSections(elf_file);
+    try elf_file.initMergeSections();
     try elf_file.sortShdrs();
     if (elf_file.zigObjectPtr()) |zig_object| {
         try zig_object.addAtomsToRelaSections(elf_file);
@@ -280,25 +286,6 @@ fn initSections(elf_file: *Elf) !void {
         try object.initRelaSections(elf_file);
     }
 
-    for (elf_file.merge_sections.items) |*msec| {
-        if (msec.subsections.items.len == 0) continue;
-        const name = msec.name(elf_file);
-        const shndx = elf_file.sectionByName(name) orelse try elf_file.addSection(.{
-            .name = name,
-            .type = msec.type,
-            .flags = msec.flags,
-        });
-        msec.output_section_index = shndx;
-
-        var entsize = elf_file.mergeSubsection(msec.subsections.items[0]).entsize;
-        for (msec.subsections.items) |index| {
-            const msub = elf_file.mergeSubsection(index);
-            entsize = @min(entsize, msub.entsize);
-        }
-        const shdr = &elf_file.shdrs.items[shndx];
-        shdr.sh_entsize = entsize;
-    }
-
     const needs_eh_frame = for (elf_file.objects.items) |index| {
         if (elf_file.file(index).?.object.cies.items.len > 0) break true;
     } else false;
src/link/Elf.zig
@@ -1342,6 +1342,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node)
     try self.addCommentString();
     try self.finalizeMergeSections();
     try self.initOutputSections();
+    try self.initMergeSections();
     try self.addLinkerDefinedSymbols();
     self.claimUnresolved();
 
@@ -3419,7 +3420,9 @@ fn initOutputSections(self: *Elf) !void {
     for (self.objects.items) |index| {
         try self.file(index).?.object.initOutputSections(self);
     }
+}
 
+pub fn initMergeSections(self: *Elf) !void {
     for (self.merge_sections.items) |*msec| {
         if (msec.subsections.items.len == 0) continue;
         const name = msec.name(self);