authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-09-26 21:47:26+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-09-26 21:49:58+02:00
log67f5d4f78c9fab17c6975a2381143796f0d38203
tree94083253af5b371a1014d6bb9ca6adb437f0d3d2
parent59ae51199ed07b0bf19a2fda61fad77094f1fc7f
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

link.Elf: Make getLDMOption() exhaustive with regards to LLD's parseEmulation().


1 files changed, 75 insertions(+), 42 deletions(-)

src/link/Elf.zig+75-42
......@@ -2205,13 +2205,8 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
22052205 }
22062206
22072207 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;
22132208 try argv.append("-m");
2214 try argv.append(arg);
2209 try argv.append(ldm);
22152210 }
22162211
22172212 if (link_mode == .static) {
......@@ -4455,45 +4450,83 @@ fn shdrTo32(shdr: elf.Elf64_Shdr) elf.Elf32_Shdr {
44554450}
44564451
44574452fn 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",
44774458 },
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",
44844462 },
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",
44924467 },
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 };
44974530}
44984531
44994532pub fn padToIdeal(actual_size: anytype) @TypeOf(actual_size) {