29 const char *LinkingOutput)
const {
32 const bool IsShared = Args.hasArg(options::OPT_shared);
34 Args.hasArg(options::OPT_static) && !Args.hasArg(options::OPT_static_pie);
35 const bool IsStaticPIE = Args.hasArg(options::OPT_static_pie);
36 ArgStringList CmdArgs;
38 if (!D.SysRoot.empty())
39 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.SysRoot));
42 CmdArgs.push_back(
"-shared");
45 CmdArgs.push_back(
"-static");
46 CmdArgs.push_back(
"-pie");
47 CmdArgs.push_back(
"--no-dynamic-linker");
48 CmdArgs.push_back(
"-z");
49 CmdArgs.push_back(
"text");
50 }
else if (IsStatic) {
51 CmdArgs.push_back(
"-static");
52 }
else if (!Args.hasArg(options::OPT_r)) {
53 if (Args.hasArg(options::OPT_rdynamic))
54 CmdArgs.push_back(
"-export-dynamic");
56 Arg *A = Args.getLastArg(options::OPT_pie, options::OPT_no_pie,
59 A ? A->getOption().matches(options::OPT_pie) : TC.isPIEDefault(Args);
61 CmdArgs.push_back(
"-pie");
62 CmdArgs.push_back(
"-dynamic-linker");
63 CmdArgs.push_back(Args.MakeArgString(TC.getDynamicLinker(Args)));
67 CmdArgs.push_back(
"--eh-frame-hdr");
71 CmdArgs.push_back(
"-o");
75 CmdArgs.push_back(
"-z");
76 CmdArgs.push_back(
"pack-relative-relocs");
78 bool HasNoStdLib = Args.hasArg(options::OPT_nostdlib, options::OPT_r);
79 bool HasNoStdLibXX = Args.hasArg(options::OPT_nostdlibxx);
80 bool HasNoLibC = Args.hasArg(options::OPT_nolibc);
81 bool HasNoStartFiles = Args.hasArg(options::OPT_nostartfiles);
82 bool HasNoDefaultLibs = Args.hasArg(options::OPT_nodefaultlibs);
84 bool ShouldLinkStartFiles = !HasNoStartFiles && !HasNoStdLib;
85 bool ShouldLinkCompilerRuntime = !HasNoDefaultLibs && !HasNoStdLib;
86 bool ShouldLinkLibC = !HasNoLibC && !HasNoStdLib && !HasNoDefaultLibs;
87 bool ShouldLinkLibCXX =
88 D.CCCIsCXX() && !HasNoStdLibXX && !HasNoStdLib && !HasNoDefaultLibs;
90 if (ShouldLinkStartFiles) {
92 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(
"crt0.o")));
94 std::string crtbegin_path;
96 std::string crtbegin =
98 if (TC.getVFS().exists(crtbegin))
99 crtbegin_path = crtbegin;
101 if (crtbegin_path.empty())
102 crtbegin_path = TC.GetFilePath(
"crtbeginS.o");
103 CmdArgs.push_back(Args.MakeArgString(crtbegin_path));
106 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
108 TC.AddFilePathLibArgs(Args, CmdArgs);
114 Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s,
115 options::OPT_t, options::OPT_r});
121 if (ShouldLinkCompilerRuntime) {
129 CmdArgs.push_back(
"-lubsan");
132 if (ShouldLinkLibCXX) {
133 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
134 !Args.hasArg(options::OPT_static);
135 CmdArgs.push_back(
"--push-state");
136 CmdArgs.push_back(
"--as-needed");
137 if (OnlyLibstdcxxStatic)
138 CmdArgs.push_back(
"-Bstatic");
139 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
140 if (OnlyLibstdcxxStatic)
141 CmdArgs.push_back(
"-Bdynamic");
142 CmdArgs.push_back(
"--pop-state");
146 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
149 CmdArgs.push_back(
"-lc");
151 if (ShouldLinkStartFiles) {
152 std::string crtend_path;
156 if (TC.getVFS().exists(crtend))
157 crtend_path = crtend;
159 if (crtend_path.empty())
160 crtend_path = TC.GetFilePath(
"crtendS.o");
161 CmdArgs.push_back(Args.MakeArgString(crtend_path));
164 const char *Exec = Args.MakeArgString(TC.GetLinkerPath());
165 C.addCommand(std::make_unique<Command>(JA, *
this,
167 Exec, CmdArgs, Inputs, Output));