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);
110 if (
auto LTO = TC.getLTOMode(Args); LTO !=
LTOK_None)
113 Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s,
114 options::OPT_t, options::OPT_r});
120 if (ShouldLinkCompilerRuntime) {
128 CmdArgs.push_back(
"-lubsan");
131 if (ShouldLinkLibCXX) {
132 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
133 !Args.hasArg(options::OPT_static);
134 CmdArgs.push_back(
"--push-state");
135 CmdArgs.push_back(
"--as-needed");
136 if (OnlyLibstdcxxStatic)
137 CmdArgs.push_back(
"-Bstatic");
138 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
139 if (OnlyLibstdcxxStatic)
140 CmdArgs.push_back(
"-Bdynamic");
141 CmdArgs.push_back(
"--pop-state");
145 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
148 CmdArgs.push_back(
"-lc");
150 if (ShouldLinkStartFiles) {
151 std::string crtend_path;
155 if (TC.getVFS().exists(crtend))
156 crtend_path = crtend;
158 if (crtend_path.empty())
159 crtend_path = TC.GetFilePath(
"crtendS.o");
160 CmdArgs.push_back(Args.MakeArgString(crtend_path));
163 const char *Exec = Args.MakeArgString(TC.GetLinkerPath());
164 C.addCommand(std::make_unique<Command>(JA, *
this,
166 Exec, CmdArgs, Inputs, Output));