https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/210663
Port Gnu.cpp changes ae623d16d50c and cac82e26c642 to FreeBSD and Serenity: -r should suppress -pie. -nopie, OpenBSD specific, should not be used by other OSes. Group the options selecting the link mode and place them after -m, as gnutools::Linker does, so that -r suppresses -export-dynamic and --hash-style as well, and -no-pie overrides the -fsanitize PIE default. Drop --enable-new-dtags: default in modern linkers. Change -Bstatic to -static to follow Gnu.cpp (identical in lld and older GNU ld). >From 3e36bc5e240efa2c28bd9020338d165ad111029d Mon Sep 17 00:00:00 2001 From: Fangrui Song <[email protected]> Date: Mon, 20 Jul 2026 01:19:06 -0700 Subject: [PATCH] [Driver,FreeBSD] Fix -pie for -r and -no-pie links Port Gnu.cpp changes ae623d16d50c and cac82e26c642 to FreeBSD and Serenity: -r should suppress -pie. -nopie, OpenBSD specific, should not be used by other OSes. Group the options selecting the link mode and place them after -m, as gnutools::Linker does, so that -r suppresses -export-dynamic and --hash-style as well, and -no-pie overrides the -fsanitize PIE default. Drop --enable-new-dtags: default in modern linkers. Change -Bstatic to -static to follow Gnu.cpp (identical in lld and older GNU ld). --- clang/lib/Driver/ToolChains/FreeBSD.cpp | 42 ++++++++++++------------ clang/lib/Driver/ToolChains/Serenity.cpp | 3 +- clang/test/Driver/freebsd.c | 16 +++++---- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index c45ae14f4e643..7f505b6306128 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -134,9 +134,6 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, const Driver &D = ToolChain.getDriver(); const llvm::Triple &Triple = ToolChain.getTriple(); const llvm::Triple::ArchType Arch = ToolChain.getArch(); - const bool IsPIE = - !Args.hasArg(options::OPT_shared) && - (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault(Args)); ArgStringList CmdArgs; // Silence warning for "clang -g foo.o -o foo" @@ -150,25 +147,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, if (!D.SysRoot.empty()) CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); - if (IsPIE) - CmdArgs.push_back("-pie"); - CmdArgs.push_back("--eh-frame-hdr"); - if (Args.hasArg(options::OPT_static)) { - CmdArgs.push_back("-Bstatic"); - } else { - if (Args.hasArg(options::OPT_rdynamic)) - CmdArgs.push_back("-export-dynamic"); - if (Args.hasArg(options::OPT_shared)) { - CmdArgs.push_back("-shared"); - } else if (!Args.hasArg(options::OPT_r)) { - CmdArgs.push_back("-dynamic-linker"); - CmdArgs.push_back("/libexec/ld-elf.so.1"); - } - if (Arch == llvm::Triple::arm || Triple.isX86()) - CmdArgs.push_back("--hash-style=both"); - CmdArgs.push_back("--enable-new-dtags"); - } // Explicitly set the linker emulation for platforms that might not // be the default emulation for the linker. @@ -226,6 +205,27 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("--no-relax"); } + const bool IsShared = Args.hasArg(options::OPT_shared); + if (IsShared) + CmdArgs.push_back("-shared"); + bool IsPIE = false; + if (Args.hasArg(options::OPT_static)) { + CmdArgs.push_back("-static"); + } else if (!Args.hasArg(options::OPT_r)) { + if (Args.hasArg(options::OPT_rdynamic)) + CmdArgs.push_back("-export-dynamic"); + if (!IsShared) { + IsPIE = Args.hasFlag(options::OPT_pie, options::OPT_no_pie, + ToolChain.isPIEDefault(Args)); + if (IsPIE) + CmdArgs.push_back("-pie"); + CmdArgs.push_back("-dynamic-linker"); + CmdArgs.push_back("/libexec/ld-elf.so.1"); + } + if (Arch == llvm::Triple::arm || Triple.isX86()) + CmdArgs.push_back("--hash-style=both"); + } + if (Arg *A = Args.getLastArg(options::OPT_G)) { if (ToolChain.getTriple().isMIPS()) { StringRef v = A->getValue(); diff --git a/clang/lib/Driver/ToolChains/Serenity.cpp b/clang/lib/Driver/ToolChains/Serenity.cpp index d43dffec8d31f..098277c96ba1d 100644 --- a/clang/lib/Driver/ToolChains/Serenity.cpp +++ b/clang/lib/Driver/ToolChains/Serenity.cpp @@ -53,8 +53,7 @@ void tools::serenity::Linker::ConstructJob(Compilation &C, const JobAction &JA, if (Args.hasArg(options::OPT_rdynamic)) CmdArgs.push_back("-export-dynamic"); if (!IsShared) { - Arg *A = Args.getLastArg(options::OPT_pie, options::OPT_no_pie, - options::OPT_nopie); + Arg *A = Args.getLastArg(options::OPT_pie, options::OPT_no_pie); bool IsPIE = A ? A->getOption().matches(options::OPT_pie) : TC.isPIEDefault(Args); if (IsPIE) diff --git a/clang/test/Driver/freebsd.c b/clang/test/Driver/freebsd.c index 91d716a33c20d..04157b462eb0f 100644 --- a/clang/test/Driver/freebsd.c +++ b/clang/test/Driver/freebsd.c @@ -8,7 +8,7 @@ // RUN: FileCheck --check-prefix=CHECK-PPC %s // CHECK-PPC: "-cc1" "-triple" "powerpc-pc-freebsd12" // CHECK-PPC: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" -// CHECK-PPC: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbegin.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtend.o" "{{.*}}crtn.o" +// CHECK-PPC: "--eh-frame-hdr" "-m" "elf32ppc_fbsd" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbegin.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtend.o" "{{.*}}crtn.o" // RUN: %clang -### --target=powerpc64-pc-freebsd12 %s --sysroot=%S/Inputs/basic_freebsd64_tree 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-PPC64 %s @@ -89,7 +89,6 @@ // RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-LDFLAGS_HASH %s // CHECK-LDFLAGS_HASH: --hash-style=both -// CHECK-LDFLAGS_HASH: --enable-new-dtags // // Check that we do not pass --hash-style=gnu and --hash-style=both to linker // and provide correct path to the dynamic linker for MIPS platforms. @@ -122,7 +121,7 @@ // RUN: %clang --target=x86_64-pc-freebsd -static %s \ // RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-STATIC %s -// CHECK-STATIC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// CHECK-STATIC: ld{{.*}}" "--eh-frame-hdr" "-static" // CHECK-STATIC: crt1.o // CHECK-STATIC: crtbeginT.o @@ -198,13 +197,18 @@ // RUN: FileCheck -check-prefix=PPC64-MUNWIND %s // PPC64-MUNWIND: "-funwind-tables=2" -/// -r suppresses -dynamic-linker, default -l and crt*.o like -nostdlib. -// RUN: %clang -### %s --target=aarch64-pc-freebsd11 -r \ +/// -r suppresses -pie, -export-dynamic, -dynamic-linker, --hash-style, +/// default -l and crt*.o like -nostdlib. +// RUN: %clang -### %s --target=x86_64-pc-freebsd11 -r -pie -rdynamic \ // RUN: --sysroot=%S/Inputs/basic_freebsd64_tree 2>&1 | FileCheck %s --check-prefix=RELOCATABLE -// RELOCATABLE: "-r" +// RELOCATABLE: ld{{.*}}" "--sysroot= +// RELOCATABLE-NOT: "-pie" +// RELOCATABLE-NOT: "-export-dynamic" // RELOCATABLE-NOT: "-dynamic-linker" +// RELOCATABLE-NOT: "--hash-style= // RELOCATABLE-NOT: "-l // RELOCATABLE-NOT: crt{{[^./\\]+}}.o +// RELOCATABLE: "-r" // Check that the -X and --no-relax flags are passed to the linker on riscv64 // RUN: %clang --target=riscv64-unknown-freebsd -mno-relax -### %s 2>&1 \ _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
