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