Skip to content

Commit ae623d1

Browse files
committed
[Driver,Gnu] Simplify -static -static-pie -shared -pie handling and suppress -shared -rdynamic warning
These options select different link modes (note: -shared -static can be used together for musl and mingw). It makes sense to place them together, which enables some simplification. The relevant ld options are now consistently placed after -m, similar to GCC. While here, suppress -Wunused-command-line-argument warning when -shared -rdynamic are used together (introduced by commit 291f4a0). It can be argued either way whether the warning is justified (in ELF linkers --export-dynamic functionality is subsumed by -shared), but it is not useful (users can do -Wl,--export-dynamic, bypassing the driver diagnostic).
1 parent ac3779e commit ae623d1

File tree

4 files changed

+27
-50
lines changed

4 files changed

+27
-50
lines changed

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -292,18 +292,6 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
292292
}
293293
}
294294

295-
static bool getPIE(const ArgList &Args, const ToolChain &TC) {
296-
if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_static) ||
297-
Args.hasArg(options::OPT_r) || Args.hasArg(options::OPT_static_pie))
298-
return false;
299-
300-
Arg *A = Args.getLastArg(options::OPT_pie, options::OPT_no_pie,
301-
options::OPT_nopie);
302-
if (!A)
303-
return TC.isPIEDefault(Args);
304-
return A->getOption().matches(options::OPT_pie);
305-
}
306-
307295
static bool getStaticPIE(const ArgList &Args, const ToolChain &TC) {
308296
bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
309297
// -no-pie is an alias for -nopie. So, handling -nopie takes care of
@@ -386,7 +374,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
386374
const bool isAndroid = ToolChain.getTriple().isAndroid();
387375
const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
388376
const bool IsVE = ToolChain.getTriple().isVE();
389-
const bool IsPIE = getPIE(Args, ToolChain);
390377
const bool IsStaticPIE = getStaticPIE(Args, ToolChain);
391378
const bool IsStatic = getStatic(Args);
392379
const bool HasCRTBeginEndFiles =
@@ -406,17 +393,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
406393
if (!D.SysRoot.empty())
407394
CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
408395

409-
if (IsPIE)
410-
CmdArgs.push_back("-pie");
411-
412-
if (IsStaticPIE) {
413-
CmdArgs.push_back("-static");
414-
CmdArgs.push_back("-pie");
415-
CmdArgs.push_back("--no-dynamic-linker");
416-
CmdArgs.push_back("-z");
417-
CmdArgs.push_back("text");
418-
}
419-
420396
if (Args.hasArg(options::OPT_s))
421397
CmdArgs.push_back("-s");
422398

@@ -451,19 +427,32 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
451427
if (Triple.isRISCV())
452428
CmdArgs.push_back("-X");
453429

454-
if (Args.hasArg(options::OPT_shared))
430+
const bool IsShared = Args.hasArg(options::OPT_shared);
431+
if (IsShared)
455432
CmdArgs.push_back("-shared");
456-
457-
if (IsStatic) {
433+
bool IsPIE = false;
434+
if (IsStaticPIE) {
435+
CmdArgs.push_back("-static");
436+
CmdArgs.push_back("-pie");
437+
CmdArgs.push_back("--no-dynamic-linker");
438+
CmdArgs.push_back("-z");
439+
CmdArgs.push_back("text");
440+
} else if (IsStatic) {
458441
CmdArgs.push_back("-static");
459-
} else if (!Args.hasArg(options::OPT_r) &&
460-
!Args.hasArg(options::OPT_shared) && !IsStaticPIE) {
442+
} else if (!Args.hasArg(options::OPT_r)) {
461443
if (Args.hasArg(options::OPT_rdynamic))
462444
CmdArgs.push_back("-export-dynamic");
463-
464-
CmdArgs.push_back("-dynamic-linker");
465-
CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) +
466-
ToolChain.getDynamicLinker(Args)));
445+
if (!IsShared) {
446+
Arg *A = Args.getLastArg(options::OPT_pie, options::OPT_no_pie,
447+
options::OPT_nopie);
448+
IsPIE = A ? A->getOption().matches(options::OPT_pie)
449+
: ToolChain.isPIEDefault(Args);
450+
if (IsPIE)
451+
CmdArgs.push_back("-pie");
452+
CmdArgs.push_back("-dynamic-linker");
453+
CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) +
454+
ToolChain.getDynamicLinker(Args)));
455+
}
467456
}
468457

469458
CmdArgs.push_back("-o");

clang/test/Driver/dynamic-linker.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// RUN: %clang -target x86_64-unknown-linux-gnu -### -shared /dev/null -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-SHARED %s
1212

1313

14-
// RUN: %clang -target armv7-unknown-linux-gnueabi -### -shared -rdynamic /dev/null -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-SHARED %s
14+
// RUN: %clang --target=armv7-unknown-linux-gnueabi -### -Werror -shared -rdynamic /dev/null -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-SHARED %s
1515
// RUN: %clang -target i386-unknown-linux-gnu -### -shared -rdynamic /dev/null -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-SHARED %s
1616
// RUN: %clang -target mips64-unknown-linux-gnu -### -shared -rdynamic /dev/null -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-SHARED %s
1717
// RUN: %clang -target powerpc64-unknown-linux-gnu -### -shared -rdynamic /dev/null -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-SHARED %s

clang/test/Driver/linux-ld.c

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,8 @@
182182
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
183183
// RUN: | FileCheck --check-prefix=CHECK-CLANG-LD-STATIC-PIE %s
184184
// CHECK-CLANG-LD-STATIC-PIE: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
185-
// CHECK-CLANG-LD-STATIC-PIE: "-static"
186-
// CHECK-CLANG-LD-STATIC-PIE: "-pie"
187-
// CHECK-CLANG-LD-STATIC-PIE: "--no-dynamic-linker"
188-
// CHECK-CLANG-LD-STATIC-PIE: "-z"
189-
// CHECK-CLANG-LD-STATIC-PIE: "text"
190185
// CHECK-CLANG-LD-STATIC-PIE: "-m" "elf_x86_64"
186+
// CHECK-CLANG-LD-STATIC-PIE-SAME: "-static" "-pie" "--no-dynamic-linker" "-z" "text"
191187
// CHECK-CLANG-LD-STATIC-PIE: "{{.*}}rcrt1.o"
192188
// CHECK-CLANG-LD-STATIC-PIE: "--start-group" "-lgcc" "-lgcc_eh" "-lc" "--end-group"
193189
//
@@ -197,12 +193,8 @@
197193
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
198194
// RUN: | FileCheck --check-prefix=CHECK-CLANG-LD-STATIC-PIE-PIE %s
199195
// CHECK-CLANG-LD-STATIC-PIE-PIE: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
200-
// CHECK-CLANG-LD-STATIC-PIE-PIE: "-static"
201-
// CHECK-CLANG-LD-STATIC-PIE-PIE: "-pie"
202-
// CHECK-CLANG-LD-STATIC-PIE-PIE: "--no-dynamic-linker"
203-
// CHECK-CLANG-LD-STATIC-PIE-PIE: "-z"
204-
// CHECK-CLANG-LD-STATIC-PIE-PIE: "text"
205196
// CHECK-CLANG-LD-STATIC-PIE-PIE: "-m" "elf_x86_64"
197+
// CHECK-CLANG-LD-STATIC-PIE-PIE-SAME: "-static" "-pie" "--no-dynamic-linker" "-z" "text"
206198
// CHECK-CLANG-LD-STATIC-PIE-PIE: "{{.*}}rcrt1.o"
207199
// CHECK-CLANG-LD-STATIC-PIE-PIE: "--start-group" "-lgcc" "-lgcc_eh" "-lc" "--end-group"
208200
//
@@ -212,12 +204,8 @@
212204
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
213205
// RUN: | FileCheck --check-prefix=CHECK-CLANG-LD-STATIC-PIE-STATIC %s
214206
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
215-
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "-static"
216-
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "-pie"
217-
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "--no-dynamic-linker"
218-
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "-z"
219-
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "text"
220207
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "-m" "elf_x86_64"
208+
// CHECK-CLANG-LD-STATIC-PIE-STATIC-SAME: "-static" "-pie" "--no-dynamic-linker" "-z" "text"
221209
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "{{.*}}rcrt1.o"
222210
// CHECK-CLANG-LD-STATIC-PIE-STATIC: "--start-group" "-lgcc" "-lgcc_eh" "-lc" "--end-group"
223211
//

clang/test/Driver/ohos.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
// CHECK-NOT: "-fno-common"
1818
// CHECK: {{.*}}ld.lld{{.*}}" "--sysroot=[[SYSROOT]]"
1919
// CHECK-NOT: "--sysroot=[[SYSROOT]]"
20-
// CHECK: "-pie"
2120
// CHECK-NOT: "--build-id"
2221
// CHECK: "--hash-style=both"
22+
// CHECK: "-pie"
2323
// CHECK: "-dynamic-linker" "/lib/ld-musl-arm.so.1"
2424
// CHECK: Scrt1.o
2525
// CHECK: crti.o

0 commit comments

Comments
 (0)