Author: Brian Cain
Date: 2026-07-19T10:48:48-05:00
New Revision: c45b4e4d00bed488d6ece5608560561732ae5b9e

URL: 
https://github.com/llvm/llvm-project/commit/c45b4e4d00bed488d6ece5608560561732ae5b9e
DIFF: 
https://github.com/llvm/llvm-project/commit/c45b4e4d00bed488d6ece5608560561732ae5b9e.diff

LOG: [Hexagon] Link static PIE executables against rcrt1.o (#210125)

We always selected crt1.o as the CRT start file, regardless of link
mode.

Select rcrt1.o - the self-relocating static-PIE start file when -static
and PIE are active

Added: 
    

Modified: 
    clang/lib/Driver/ToolChains/Hexagon.cpp
    clang/test/Driver/hexagon-toolchain-linux.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/Hexagon.cpp 
b/clang/lib/Driver/ToolChains/Hexagon.cpp
index f5b0df3bf0b8d..2ddc15ddbd818 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.cpp
+++ b/clang/lib/Driver/ToolChains/Hexagon.cpp
@@ -365,11 +365,14 @@ constructHexagonLinkArgs(Compilation &C, const JobAction 
&JA,
     };
 
     if (!Args.hasArg(options::OPT_shared, options::OPT_nostartfiles,
-                     options::OPT_nostdlib, options::OPT_r))
-      CmdArgs.push_back(Args.MakeArgString(StartFile("crt1.o")));
-    else if (Args.hasArg(options::OPT_shared) &&
-             !Args.hasArg(options::OPT_nostartfiles, options::OPT_nostdlib,
-                          options::OPT_r))
+                     options::OPT_nostdlib, options::OPT_r)) {
+      if (IsStatic && IsPIE)
+        CmdArgs.push_back(Args.MakeArgString(StartFile("rcrt1.o")));
+      else
+        CmdArgs.push_back(Args.MakeArgString(StartFile("crt1.o")));
+    } else if (Args.hasArg(options::OPT_shared) &&
+               !Args.hasArg(options::OPT_nostartfiles, options::OPT_nostdlib,
+                            options::OPT_r))
       CmdArgs.push_back(Args.MakeArgString(StartFile("crti.o")));
 
     if (!MLSuffix.empty()) {

diff  --git a/clang/test/Driver/hexagon-toolchain-linux.c 
b/clang/test/Driver/hexagon-toolchain-linux.c
index ed2acd9c61c2e..1365c6adc22eb 100644
--- a/clang/test/Driver/hexagon-toolchain-linux.c
+++ b/clang/test/Driver/hexagon-toolchain-linux.c
@@ -200,6 +200,49 @@
 // CHECK-RELOC-NORMAL: 
"-dynamic-linker={{/|\\\\}}lib{{/|\\\\}}ld-musl-hexagon.so.1"
 // CHECK-RELOC-NORMAL: "{{.*}}crt1.o"
 
+// 
-----------------------------------------------------------------------------
+// Startup object: -static alone gets PIE by default (see PIE-DEFAULT above),
+// so it must link the self-relocating rcrt1.o, not the plain crt1.o. Plain
+// crt1.o never processes the R_HEX_RELATIVE relocations a static-PIE image
+// needs, and the resulting binary crashes during libc startup.
+// 
-----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-unknown-linux-musl \
+// RUN:   -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN:   -mcpu=hexagonv60 \
+// RUN:   --sysroot=%S/Inputs/basic_linux_libcxx_tree -static %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-STATIC-PIE %s
+// CHECK-STATIC-PIE:      "-static" "-pie"
+// CHECK-STATIC-PIE:      
"{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}rcrt1.o"
+// CHECK-STATIC-PIE-NOT:  
"{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crt1.o"
+
+// 
-----------------------------------------------------------------------------
+// Startup object: -static -no-pie must still link the plain, non-relocating
+// crt1.o (a static non-PIE image has no relocations to apply).
+// 
-----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-unknown-linux-musl \
+// RUN:   -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN:   -mcpu=hexagonv60 \
+// RUN:   --sysroot=%S/Inputs/basic_linux_libcxx_tree -static -no-pie %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-STATIC-NO-PIE %s
+// CHECK-STATIC-NO-PIE:      "-static"
+// CHECK-STATIC-NO-PIE-NOT:  "-pie"
+// CHECK-STATIC-NO-PIE:      
"{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crt1.o"
+// CHECK-STATIC-NO-PIE-NOT:  
"{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}rcrt1.o"
+
+// 
-----------------------------------------------------------------------------
+// Startup object: a non-static (dynamic) link keeps using crt1.o even though
+// PIE is on by default -- relocation is the dynamic linker's job there, not
+// the CRT's.
+// 
-----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-unknown-linux-musl \
+// RUN:   -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN:   -mcpu=hexagonv60 \
+// RUN:   --sysroot=%S/Inputs/basic_linux_libcxx_tree %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-DYNAMIC-PIE %s
+// CHECK-DYNAMIC-PIE:      "-pie"
+// CHECK-DYNAMIC-PIE:      
"{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crt1.o"
+// CHECK-DYNAMIC-PIE-NOT:  
"{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}rcrt1.o"
+
 // 
-----------------------------------------------------------------------------
 // Sanitizer library paths: -fsanitize=memory
 // 
-----------------------------------------------------------------------------


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to