| ... | ... | @@ -2205,13 +2205,8 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s |
| 2205 | 2205 | } |
| 2206 | 2206 | |
| 2207 | 2207 | if (getLDMOption(target)) |ldm| { |
| 2208 | | // Any target ELF will use the freebsd osabi if suffixed with "_fbsd". |
| 2209 | | const arg = if (target.os.tag == .freebsd) |
| 2210 | | try std.fmt.allocPrint(arena, "{s}_fbsd", .{ldm}) |
| 2211 | | else |
| 2212 | | ldm; |
| 2213 | 2208 | try argv.append("-m"); |
| 2214 | | try argv.append(arg); |
| 2209 | try argv.append(ldm); |
| 2215 | 2210 | } |
| 2216 | 2211 | |
| 2217 | 2212 | if (link_mode == .static) { |
| ... | ... | @@ -4455,45 +4450,83 @@ fn shdrTo32(shdr: elf.Elf64_Shdr) elf.Elf32_Shdr { |
| 4455 | 4450 | } |
| 4456 | 4451 | |
| 4457 | 4452 | fn getLDMOption(target: std.Target) ?[]const u8 { |
| 4458 | | switch (target.cpu.arch) { |
| 4459 | | .x86 => return "elf_i386", |
| 4460 | | .aarch64 => return "aarch64linux", |
| 4461 | | .aarch64_be => return "aarch64linuxb", |
| 4462 | | .arm, .thumb => return "armelf_linux_eabi", |
| 4463 | | .armeb, .thumbeb => return "armelfb_linux_eabi", |
| 4464 | | .powerpc => return "elf32ppclinux", |
| 4465 | | .powerpc64 => return "elf64ppc", |
| 4466 | | .powerpc64le => return "elf64lppc", |
| 4467 | | .sparc => return "elf32_sparc", |
| 4468 | | .sparc64 => return "elf64_sparc", |
| 4469 | | .mips => return "elf32btsmip", |
| 4470 | | .mipsel => return "elf32ltsmip", |
| 4471 | | .mips64 => { |
| 4472 | | if (target.abi == .gnuabin32) { |
| 4473 | | return "elf32btsmipn32"; |
| 4474 | | } else { |
| 4475 | | return "elf64btsmip"; |
| 4476 | | } |
| 4453 | // This should only return emulations understood by LLD's parseEmulation(). |
| 4454 | return switch (target.cpu.arch) { |
| 4455 | .aarch64 => switch (target.os.tag) { |
| 4456 | .linux => "aarch64linux", |
| 4457 | else => "aarch64elf", |
| 4477 | 4458 | }, |
| 4478 | | .mips64el => { |
| 4479 | | if (target.abi == .gnuabin32) { |
| 4480 | | return "elf32ltsmipn32"; |
| 4481 | | } else { |
| 4482 | | return "elf64ltsmip"; |
| 4483 | | } |
| 4459 | .aarch64_be => switch (target.os.tag) { |
| 4460 | .linux => "aarch64linuxb", |
| 4461 | else => "aarch64elfb", |
| 4484 | 4462 | }, |
| 4485 | | .s390x => return "elf64_s390", |
| 4486 | | .x86_64 => { |
| 4487 | | if (target.abi == .gnux32) { |
| 4488 | | return "elf32_x86_64"; |
| 4489 | | } else { |
| 4490 | | return "elf_x86_64"; |
| 4491 | | } |
| 4463 | .amdgcn => "elf64_amdgpu", |
| 4464 | .arm, .thumb => switch (target.os.tag) { |
| 4465 | .linux => "armelf_linux_eabi", |
| 4466 | else => "armelf", |
| 4492 | 4467 | }, |
| 4493 | | .riscv32 => return "elf32lriscv", |
| 4494 | | .riscv64 => return "elf64lriscv", |
| 4495 | | else => return null, |
| 4496 | | } |
| 4468 | .armeb, .thumbeb => switch (target.os.tag) { |
| 4469 | .linux => "armelfb_linux_eabi", |
| 4470 | else => "armelfb", |
| 4471 | }, |
| 4472 | .hexagon => "hexagonelf", |
| 4473 | .loongarch32 => "elf32loongarch", |
| 4474 | .loongarch64 => "elf64loongarch", |
| 4475 | .mips => switch (target.os.tag) { |
| 4476 | .freebsd => "elf32btsmip_fbsd", |
| 4477 | else => "elf32btsmip", |
| 4478 | }, |
| 4479 | .mipsel => switch (target.os.tag) { |
| 4480 | .freebsd => "elf32ltsmip_fbsd", |
| 4481 | else => "elf32ltsmip", |
| 4482 | }, |
| 4483 | .mips64 => switch (target.os.tag) { |
| 4484 | .freebsd => switch (target.abi) { |
| 4485 | .gnuabin32 => "elf32btsmipn32_fbsd", |
| 4486 | else => "elf64btsmip_fbsd", |
| 4487 | }, |
| 4488 | else => switch (target.abi) { |
| 4489 | .gnuabin32 => "elf32btsmipn32", |
| 4490 | else => "elf64btsmip", |
| 4491 | }, |
| 4492 | }, |
| 4493 | .mips64el => switch (target.os.tag) { |
| 4494 | .freebsd => switch (target.abi) { |
| 4495 | .gnuabin32 => "elf32ltsmipn32_fbsd", |
| 4496 | else => "elf64ltsmip_fbsd", |
| 4497 | }, |
| 4498 | else => switch (target.abi) { |
| 4499 | .gnuabin32 => "elf32ltsmipn32", |
| 4500 | else => "elf64ltsmip", |
| 4501 | }, |
| 4502 | }, |
| 4503 | .msp430 => "msp430elf", |
| 4504 | .powerpc => switch (target.os.tag) { |
| 4505 | .freebsd => "elf32ppc_fbsd", |
| 4506 | .linux => "elf32ppclinux", |
| 4507 | else => "elf32ppc", |
| 4508 | }, |
| 4509 | .powerpcle => switch (target.os.tag) { |
| 4510 | .linux => "elf32lppclinux", |
| 4511 | else => "elf32lppc", |
| 4512 | }, |
| 4513 | .powerpc64 => "elf64ppc", |
| 4514 | .powerpc64le => "elf64lppc", |
| 4515 | .riscv32 => "elf32lriscv", |
| 4516 | .riscv64 => "elf64lriscv", |
| 4517 | .s390x => "elf64_s390", |
| 4518 | .sparc64 => "elf64_sparc", |
| 4519 | .x86 => switch (target.os.tag) { |
| 4520 | .elfiamcu => "elf_iamcu", |
| 4521 | .freebsd => "elf_i386_fbsd", |
| 4522 | else => "elf_i386", |
| 4523 | }, |
| 4524 | .x86_64 => switch (target.abi) { |
| 4525 | .gnux32, .muslx32 => "elf32_x86_64", |
| 4526 | else => "elf_x86_64", |
| 4527 | }, |
| 4528 | else => null, |
| 4529 | }; |
| 4497 | 4530 | } |
| 4498 | 4531 | |
| 4499 | 4532 | pub fn padToIdeal(actual_size: anytype) @TypeOf(actual_size) { |