| ... | ... | @@ -1140,7 +1140,109 @@ fn getNavShdrIndex( |
| 1140 | 1140 | const ptr_size = elf_file.ptrWidthBytes(); |
| 1141 | 1141 | const ip = &zcu.intern_pool; |
| 1142 | 1142 | const nav_val = zcu.navValue(nav_index); |
| 1143 | | if (ip.isFunctionType(nav_val.typeOf(zcu).toIntern())) { |
| 1143 | const is_func = ip.isFunctionType(nav_val.typeOf(zcu).toIntern()); |
| 1144 | if (ip.getNav(nav_index).getLinkSection().unwrap()) |@"linksection"| { |
| 1145 | const section_name = @"linksection".toSlice(ip); |
| 1146 | if (elf_file.sectionByName(section_name)) |osec| { |
| 1147 | if (is_func) { |
| 1148 | elf_file.sections.items(.shdr)[osec].sh_flags |= elf.SHF_EXECINSTR; |
| 1149 | } else { |
| 1150 | elf_file.sections.items(.shdr)[osec].sh_flags |= elf.SHF_WRITE; |
| 1151 | } |
| 1152 | return osec; |
| 1153 | } |
| 1154 | const osec = try elf_file.addSection(.{ |
| 1155 | .type = elf.SHT_PROGBITS, |
| 1156 | .flags = elf.SHF_ALLOC | @as(u64, if (is_func) elf.SHF_EXECINSTR else elf.SHF_WRITE), |
| 1157 | .name = try elf_file.insertShString(section_name), |
| 1158 | .addralign = 1, |
| 1159 | }); |
| 1160 | const section_index = try self.addSectionSymbol(gpa, try self.addString(gpa, section_name), osec); |
| 1161 | if (std.mem.eql(u8, section_name, ".text")) { |
| 1162 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC | elf.SHF_EXECINSTR; |
| 1163 | self.text_index = section_index; |
| 1164 | } else if (std.mem.startsWith(u8, section_name, ".text.")) { |
| 1165 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC | elf.SHF_EXECINSTR; |
| 1166 | } else if (std.mem.eql(u8, section_name, ".rodata")) { |
| 1167 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC; |
| 1168 | self.rodata_index = section_index; |
| 1169 | } else if (std.mem.startsWith(u8, section_name, ".rodata.")) { |
| 1170 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC; |
| 1171 | } else if (std.mem.eql(u8, section_name, ".data.rel.ro")) { |
| 1172 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE; |
| 1173 | self.data_relro_index = section_index; |
| 1174 | } else if (std.mem.eql(u8, section_name, ".data")) { |
| 1175 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE; |
| 1176 | self.data_index = section_index; |
| 1177 | } else if (std.mem.startsWith(u8, section_name, ".data.")) { |
| 1178 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE; |
| 1179 | } else if (std.mem.eql(u8, section_name, ".bss")) { |
| 1180 | const shdr = &elf_file.sections.items(.shdr)[osec]; |
| 1181 | shdr.sh_type = elf.SHT_NOBITS; |
| 1182 | shdr.sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE; |
| 1183 | self.bss_index = section_index; |
| 1184 | } else if (std.mem.startsWith(u8, section_name, ".bss.")) { |
| 1185 | const shdr = &elf_file.sections.items(.shdr)[osec]; |
| 1186 | shdr.sh_type = elf.SHT_NOBITS; |
| 1187 | shdr.sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE; |
| 1188 | } else if (std.mem.eql(u8, section_name, ".tdata")) { |
| 1189 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE | elf.SHF_TLS; |
| 1190 | self.tdata_index = section_index; |
| 1191 | } else if (std.mem.startsWith(u8, section_name, ".tdata.")) { |
| 1192 | elf_file.sections.items(.shdr)[osec].sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE | elf.SHF_TLS; |
| 1193 | } else if (std.mem.eql(u8, section_name, ".tbss")) { |
| 1194 | const shdr = &elf_file.sections.items(.shdr)[osec]; |
| 1195 | shdr.sh_type = elf.SHT_NOBITS; |
| 1196 | shdr.sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE | elf.SHF_TLS; |
| 1197 | self.tbss_index = section_index; |
| 1198 | } else if (std.mem.startsWith(u8, section_name, ".tbss.")) { |
| 1199 | const shdr = &elf_file.sections.items(.shdr)[osec]; |
| 1200 | shdr.sh_type = elf.SHT_NOBITS; |
| 1201 | shdr.sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE | elf.SHF_TLS; |
| 1202 | } else if (std.mem.eql(u8, section_name, ".eh_frame")) { |
| 1203 | const target = &zcu.navFileScope(nav_index).mod.?.resolved_target.result; |
| 1204 | const shdr = &elf_file.sections.items(.shdr)[osec]; |
| 1205 | if (target.cpu.arch == .x86_64) shdr.sh_type = elf.SHT_X86_64_UNWIND; |
| 1206 | shdr.sh_flags = elf.SHF_ALLOC; |
| 1207 | self.eh_frame_index = section_index; |
| 1208 | } else if (std.mem.eql(u8, section_name, ".debug_info")) { |
| 1209 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1210 | self.debug_info_index = section_index; |
| 1211 | } else if (std.mem.eql(u8, section_name, ".debug_abbrev")) { |
| 1212 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1213 | self.debug_abbrev_index = section_index; |
| 1214 | } else if (std.mem.eql(u8, section_name, ".debug_aranges")) { |
| 1215 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1216 | self.debug_aranges_index = section_index; |
| 1217 | } else if (std.mem.eql(u8, section_name, ".debug_str")) { |
| 1218 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1219 | self.debug_str_index = section_index; |
| 1220 | } else if (std.mem.eql(u8, section_name, ".debug_line")) { |
| 1221 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1222 | self.debug_line_index = section_index; |
| 1223 | } else if (std.mem.eql(u8, section_name, ".debug_line_str")) { |
| 1224 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1225 | self.debug_line_str_index = section_index; |
| 1226 | } else if (std.mem.eql(u8, section_name, ".debug_loclists")) { |
| 1227 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1228 | self.debug_loclists_index = section_index; |
| 1229 | } else if (std.mem.eql(u8, section_name, ".debug_rnglists")) { |
| 1230 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1231 | self.debug_rnglists_index = section_index; |
| 1232 | } else if (std.mem.startsWith(u8, section_name, ".debug")) { |
| 1233 | elf_file.sections.items(.shdr)[osec].sh_flags = 0; |
| 1234 | } else if (std.mem.eql(u8, section_name, ".init_array") or std.mem.startsWith(u8, section_name, ".init_array.")) { |
| 1235 | const shdr = &elf_file.sections.items(.shdr)[osec]; |
| 1236 | shdr.sh_type = elf.SHT_INIT_ARRAY; |
| 1237 | shdr.sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE; |
| 1238 | } else if (std.mem.eql(u8, section_name, ".fini_array") or std.mem.startsWith(u8, section_name, ".fini_array.")) { |
| 1239 | const shdr = &elf_file.sections.items(.shdr)[osec]; |
| 1240 | shdr.sh_type = elf.SHT_FINI_ARRAY; |
| 1241 | shdr.sh_flags = elf.SHF_ALLOC | elf.SHF_WRITE; |
| 1242 | } |
| 1243 | return osec; |
| 1244 | } |
| 1245 | if (is_func) { |
| 1144 | 1246 | if (self.text_index) |symbol_index| |
| 1145 | 1247 | return self.symbol(symbol_index).outputShndx(elf_file).?; |
| 1146 | 1248 | const osec = try elf_file.addSection(.{ |