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);
58 A ? A->getOption().matches(options::OPT_pie) : TC.isPIEDefault(Args);
60 CmdArgs.push_back(
"-pie");
61 CmdArgs.push_back(
"-dynamic-linker");
62 CmdArgs.push_back(Args.MakeArgString(TC.getDynamicLinker(Args)));
66 CmdArgs.push_back(
"--eh-frame-hdr");
70 CmdArgs.push_back(
"-o");
74 CmdArgs.push_back(
"-z");
75 CmdArgs.push_back(
"pack-relative-relocs");
77 bool HasNoStdLib = Args.hasArg(options::OPT_nostdlib, options::OPT_r);
78 bool HasNoStdLibXX = Args.hasArg(options::OPT_nostdlibxx);
79 bool HasNoLibC = Args.hasArg(options::OPT_nolibc);
80 bool HasNoStartFiles = Args.hasArg(options::OPT_nostartfiles);
81 bool HasNoDefaultLibs = Args.hasArg(options::OPT_nodefaultlibs);
83 bool ShouldLinkStartFiles = !HasNoStartFiles && !HasNoStdLib;
84 bool ShouldLinkCompilerRuntime = !HasNoDefaultLibs && !HasNoStdLib;
85 bool ShouldLinkLibC = !HasNoLibC && !HasNoStdLib && !HasNoDefaultLibs;
86 bool ShouldLinkLibCXX =
87 D.CCCIsCXX() && !HasNoStdLibXX && !HasNoStdLib && !HasNoDefaultLibs;
89 if (ShouldLinkStartFiles) {
91 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(
"crt0.o")));
93 std::string crtbegin_path;
95 std::string crtbegin =
97 if (TC.getVFS().exists(crtbegin))
98 crtbegin_path = crtbegin;
100 if (crtbegin_path.empty())
101 crtbegin_path = TC.GetFilePath(
"crtbeginS.o");
102 CmdArgs.push_back(Args.MakeArgString(crtbegin_path));
105 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
107 TC.AddFilePathLibArgs(Args, CmdArgs);
109 if (
auto LTO = TC.getLTOMode(Args); LTO !=
LTOK_None)
112 Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s,
113 options::OPT_t, options::OPT_r});
119 if (ShouldLinkCompilerRuntime) {
127 CmdArgs.push_back(
"-lubsan");
130 if (ShouldLinkLibCXX) {
131 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
132 !Args.hasArg(options::OPT_static);
133 CmdArgs.push_back(
"--push-state");
134 CmdArgs.push_back(
"--as-needed");
135 if (OnlyLibstdcxxStatic)
136 CmdArgs.push_back(
"-Bstatic");
137 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
138 if (OnlyLibstdcxxStatic)
139 CmdArgs.push_back(
"-Bdynamic");
140 CmdArgs.push_back(
"--pop-state");
144 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
147 CmdArgs.push_back(
"-lc");
149 if (ShouldLinkStartFiles) {
150 std::string crtend_path;
154 if (TC.getVFS().exists(crtend))
155 crtend_path = crtend;
157 if (crtend_path.empty())
158 crtend_path = TC.GetFilePath(
"crtendS.o");
159 CmdArgs.push_back(Args.MakeArgString(crtend_path));
162 const char *Exec = Args.MakeArgString(TC.GetLinkerPath());
163 C.addCommand(std::make_unique<Command>(JA, *
this,
165 Exec, CmdArgs, Inputs, Output));