[lld] [LLD][ELF] Allow merging XO and RX sections, and add `--[no-]xosegment` flag (PR #132412)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sat Mar 22 23:56:12 PDT 2025


=?utf-8?q?Csanád_Hajdú?= <csanad.hajdu at arm.com>,
=?utf-8?q?Csanád_Hajdú?= <csanad.hajdu at arm.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/132412 at github.com>


================
@@ -0,0 +1,55 @@
+// REQUIRES: aarch64
+// RUN: rm -rf %t && split-file %s %t && cd %t
+
+// RUN: llvm-mc -filetype=obj -triple=aarch64 start.s -o start.o
+// RUN: llvm-mc -filetype=obj -triple=aarch64 xo.s -o xo.o
+// RUN: llvm-mc -filetype=obj -triple=aarch64 rx.s -o rx.o
+// RUN: ld.lld start.o xo.o -o xo
+// RUN: ld.lld start.o rx.o -o rx-default
+// RUN: ld.lld --xosegment start.o rx.o -o rx-xosegment
+// RUN: ld.lld --no-xosegment start.o rx.o -o rx-no-xosegment
+// RUN: llvm-readelf -l xo | FileCheck --check-prefix=CHECK-XO %s
+// RUN: llvm-readelf -l rx-default | FileCheck --check-prefix=CHECK-MERGED %s
+// RUN: llvm-readelf -l rx-xosegment | FileCheck --check-prefix=CHECK-SEPARATE %s
+// RUN: llvm-readelf -l rx-no-xosegment | FileCheck --check-prefix=CHECK-MERGED %s
+
+// CHECK-XO:      PHDR
+// CHECK-XO-NEXT: LOAD
+// CHECK-XO-NEXT: LOAD 0x000120 0x0000000000210120 0x0000000000210120 0x00000c 0x00000c   E 0x10000
+/// Index should match the index of the LOAD section above.
+// CHECK-XO:      02   .text .foo
+
+// CHECK-MERGED:      PHDR
+// CHECK-MERGED-NEXT: LOAD
+// CHECK-MERGED-NEXT: LOAD 0x000120 0x0000000000210120 0x0000000000210120 0x00000c 0x00000c R E 0x10000
+/// Index should match the index of the LOAD section above.
+// CHECK-MERGED:      02   .text .foo
+
+// CHECK-SEPARATE:      PHDR
+// CHECK-SEPARATE-NEXT: LOAD
+// CHECK-SEPARATE-NEXT: LOAD 0x000158 0x0000000000210158 0x0000000000210158 0x000008 0x000008   E 0x10000
+// CHECK-SEPARATE-NEXT: LOAD 0x000160 0x0000000000220160 0x0000000000220160 0x000004 0x000004 R E 0x10000
+/// Index should match the index of the LOAD section above.
+// CHECK-SEPARATE:      02   .text
+// CHECK-SEPARATE:      03   .foo
+
+//--- start.s
+.section .text,"axy", at progbits,unique,0
+.global _start
+_start:
+  bl foo
+  ret
+
+//--- xo.s
+.section .foo,"axy", at progbits,unique,0
+.global foo
+foo:
+  ret
+
+//--- rx.s
+/// An empty .text section is implicitly created without the SHF_AARCH64_PURECODE flag without this.
----------------
MaskRay wrote:

`Ensure that the implicitly-created .text section has the SHF_AARCH64_PURECODE flag.`

https://github.com/llvm/llvm-project/pull/132412


More information about the llvm-commits mailing list