|
1 | | -# REQUIRES: x86 |
2 | | - |
3 | | -# RUN: echo '.data; .file "file2"; foo2:; .global bar2; .hidden bar2; bar2:' > %t2.s |
4 | | -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t2.s -o %t2.o |
5 | | -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o |
6 | | - |
7 | | -# RUN: ld.lld -o %t %t1.o %t2.o --emit-relocs |
8 | | -# RUN: llvm-readelf --symbols --sections %t | FileCheck %s |
9 | | - |
10 | | -## Check we sort local symbols to match the following order: |
11 | | -## file1, local1, section1, hidden1, file2, local2, section2, hidden2 ... |
12 | | - |
13 | | -# CHECK: Section Headers: |
14 | | -# CHECK: [Nr] Name |
15 | | -# CHECK: [ [[ST:.*]]] .text |
16 | | -# CHECK: [ [[SD:.*]]] .data |
17 | | -# CHECK: [ [[SC:.*]]] .comment |
18 | | - |
19 | | -# CHECK: Size Type Bind Vis Ndx Name |
20 | | -# CHECK-NEXT: 0 NOTYPE LOCAL DEFAULT UND |
21 | | -# CHECK-NEXT: 0 FILE LOCAL DEFAULT ABS file1 |
22 | | -# CHECK-NEXT: 0 NOTYPE LOCAL DEFAULT 1 foo1 |
23 | | -# CHECK-NEXT: 0 SECTION LOCAL DEFAULT [[ST]] |
24 | | -# CHECK-NEXT: 0 NOTYPE LOCAL HIDDEN 1 bar1 |
25 | | -# CHECK-NEXT: 0 FILE LOCAL DEFAULT ABS file2 |
26 | | -# CHECK-NEXT: 0 NOTYPE LOCAL DEFAULT 2 foo2 |
27 | | -# CHECK-NEXT: 0 SECTION LOCAL DEFAULT [[SD]] |
28 | | -# CHECK-NEXT: 0 NOTYPE LOCAL HIDDEN 2 bar2 |
29 | | -# CHECK-NEXT: 0 SECTION LOCAL DEFAULT [[SC]] |
30 | | - |
31 | | -foo1: |
32 | | - |
33 | | -.global bar1 |
34 | | -.hidden bar1 |
35 | | -bar1: |
36 | | - |
37 | | -.file "file1" |
| 1 | +# REQUIRES: aarch64 |
| 2 | +## Check the order of local symbols: grouped by file, each group led by the file's STT symbol. |
| 3 | +## Symbols converted to STB_LOCAL are placed at the end of the local part after a synthetic |
| 4 | +## STT_FILE with an empty name, omitted if the output has no STT_FILE. |
| 5 | + |
| 6 | +# RUN: rm -rf %t && split-file %s %t && cd %t |
| 7 | +## -implicit-mapsyms omits the input $x/$d mapping symbols; only the linker's |
| 8 | +## own thunk mapping symbols remain (THUNK below). |
| 9 | +# RUN: llvm-mc -filetype=obj -triple=aarch64 -implicit-mapsyms a.s -o a.o |
| 10 | +# RUN: llvm-mc -filetype=obj -triple=aarch64 -implicit-mapsyms b.s -o b.o |
| 11 | +# RUN: mkdir c && llvm-mc -filetype=obj -triple=aarch64 -implicit-mapsyms c.s -o c/a.o |
| 12 | + |
| 13 | +## Only b.c has an STT_FILE. a.o's a_local has no leading STT_FILE; the hidden |
| 14 | +## a_hidden follows the synthetic STT_FILE. --emit-relocs adds STT_SECTION |
| 15 | +## symbols to their file's group. |
| 16 | +# RUN: ld.lld --emit-relocs a.o b.o -o ab |
| 17 | +# RUN: llvm-readelf -s ab | FileCheck %s |
| 18 | + |
| 19 | +# CHECK: NOTYPE LOCAL DEFAULT [[#]] a_local |
| 20 | +# CHECK-NEXT: SECTION LOCAL DEFAULT [[#]] .text |
| 21 | +# CHECK-NEXT: FILE LOCAL DEFAULT ABS b.c |
| 22 | +# CHECK-NEXT: NOTYPE LOCAL DEFAULT [[#]] b_local |
| 23 | +# CHECK-NEXT: SECTION LOCAL DEFAULT [[#]] .data |
| 24 | +# CHECK-NEXT: SECTION LOCAL DEFAULT [[#]] .comment |
| 25 | +# CHECK-NEXT: FILE LOCAL DEFAULT ABS{{ $}} |
| 26 | +# CHECK-NEXT: NOTYPE LOCAL HIDDEN [[#]] a_hidden |
| 27 | +# CHECK-NEXT: NOTYPE GLOBAL DEFAULT [[#]] a_localized |
| 28 | +# CHECK-NEXT: NOTYPE GLOBAL DEFAULT [[#]] a_exported |
| 29 | +# CHECK-NEXT: NOTYPE GLOBAL DEFAULT [[#]] b_localized |
| 30 | +# CHECK-NEXT: NOTYPE GLOBAL DEFAULT [[#]] b_exported |
| 31 | + |
| 32 | +## For -r, synthesize STT_FILE for a.o, which lacks one. |
| 33 | +# RUN: ld.lld -r a.o b.o -o ab.o |
| 34 | +# RUN: llvm-readelf -s ab.o | FileCheck %s --check-prefix=RO |
| 35 | + |
| 36 | +# RO: FILE LOCAL DEFAULT ABS a.o |
| 37 | +# RO-NEXT: NOTYPE LOCAL DEFAULT [[#]] a_local |
| 38 | +# RO-NEXT: SECTION LOCAL DEFAULT [[#]] .text |
| 39 | +# RO-NEXT: FILE LOCAL DEFAULT ABS b.c |
| 40 | +# RO-NEXT: NOTYPE LOCAL DEFAULT [[#]] b_local |
| 41 | +# RO-NEXT: SECTION LOCAL DEFAULT [[#]] .data |
| 42 | +# RO-NEXT: NOTYPE GLOBAL DEFAULT [[#]] a_localized |
| 43 | +# RO-NEXT: NOTYPE GLOBAL HIDDEN [[#]] a_hidden |
| 44 | +# RO-NEXT: NOTYPE GLOBAL DEFAULT [[#]] a_exported |
| 45 | +# RO-NEXT: NOTYPE GLOBAL DEFAULT [[#]] b_localized |
| 46 | +# RO-NEXT: NOTYPE GLOBAL DEFAULT [[#]] b_exported |
| 47 | + |
| 48 | +## Synthesize STT_FILE named after its basename, not its path, for local determinism (#47367). |
| 49 | +# RUN: ld.lld -r ab.o c/a.o -o abc.o |
| 50 | +# RUN: llvm-readelf -s abc.o | FileCheck %s --check-prefix=MULTI |
| 51 | + |
| 52 | +# MULTI: FILE LOCAL DEFAULT ABS a.o |
| 53 | +# MULTI-NEXT: NOTYPE LOCAL DEFAULT [[#]] a_local |
| 54 | +# MULTI-NEXT: FILE LOCAL DEFAULT ABS b.c |
| 55 | +# MULTI-NEXT: NOTYPE LOCAL DEFAULT [[#]] b_local |
| 56 | +# MULTI-NEXT: SECTION LOCAL DEFAULT [[#]] .text |
| 57 | +# MULTI-NEXT: SECTION LOCAL DEFAULT [[#]] .data |
| 58 | +# MULTI-NEXT: FILE LOCAL DEFAULT ABS a.o |
| 59 | +# MULTI-NEXT: NOTYPE LOCAL DEFAULT [[#]] far |
| 60 | + |
| 61 | +## Symbols localized by a version script follow a synthetic STT_FILE with empty name. |
| 62 | +# RUN: ld.lld -shared --version-script=ver ab.o -o ab.so |
| 63 | +# RUN: llvm-readelf -s ab.so | FileCheck %s --check-prefix=VER |
| 64 | + |
| 65 | +# VER: FILE LOCAL DEFAULT ABS a.o |
| 66 | +# VER-NEXT: NOTYPE LOCAL DEFAULT [[#]] a_local |
| 67 | +# VER-NEXT: FILE LOCAL DEFAULT ABS b.c |
| 68 | +# VER-NEXT: NOTYPE LOCAL DEFAULT [[#]] b_local |
| 69 | +# VER-NEXT: FILE LOCAL DEFAULT ABS{{ $}} |
| 70 | +# VER-NEXT: NOTYPE LOCAL DEFAULT [[#]] a_localized |
| 71 | +# VER-NEXT: NOTYPE LOCAL HIDDEN [[#]] a_hidden |
| 72 | +# VER-NEXT: NOTYPE LOCAL DEFAULT [[#]] b_localized |
| 73 | +# VER-NEXT: NOTYPE LOCAL HIDDEN [[#]] _DYNAMIC |
| 74 | +# VER-NEXT: NOTYPE GLOBAL DEFAULT [[#]] a_exported |
| 75 | +# VER-NEXT: NOTYPE GLOBAL DEFAULT [[#]] b_exported |
| 76 | + |
| 77 | +## A range-extension thunk (and its $x/$d) is added by |
| 78 | +## finalizeAddressDependentContent and parented to the internal file, which has |
| 79 | +## no STT_FILE. Like the demoted c_hidden it cannot be attributed to a file, so |
| 80 | +## it follows the synthetic STT_FILE. |
| 81 | +# RUN: ld.lld c/a.o b.o -T lds -o cb |
| 82 | +# RUN: llvm-readelf -s cb | FileCheck %s --check-prefix=THUNK |
| 83 | + |
| 84 | +# THUNK: NOTYPE LOCAL DEFAULT [[#]] far |
| 85 | +# THUNK-NEXT: FILE LOCAL DEFAULT ABS b.c |
| 86 | +# THUNK-NEXT: NOTYPE LOCAL DEFAULT [[#]] b_local |
| 87 | +# THUNK-NEXT: FILE LOCAL DEFAULT ABS{{ $}} |
| 88 | +# THUNK-NEXT: NOTYPE LOCAL HIDDEN [[#]] c_hidden |
| 89 | +# THUNK-NEXT: FUNC LOCAL DEFAULT [[#]] __AArch64AbsLongThunk_{{.*}} |
| 90 | +# THUNK-NEXT: NOTYPE LOCAL DEFAULT [[#]] $x |
| 91 | +# THUNK-NEXT: NOTYPE LOCAL DEFAULT [[#]] $d |
| 92 | +# THUNK-NEXT: NOTYPE GLOBAL DEFAULT [[#]] _start |
| 93 | + |
| 94 | +## --discard-all discards STT_FILE symbols as well. With no STT_FILE in the |
| 95 | +## output, no synthetic STT_FILE is added. |
| 96 | +# RUN: ld.lld -shared --discard-all --version-script=ver ab.o -o ab2.so |
| 97 | +# RUN: llvm-readelf -s ab2.so | FileCheck %s --check-prefix=DISCARD --implicit-check-not=FILE |
| 98 | + |
| 99 | +# DISCARD: NOTYPE LOCAL DEFAULT [[#]] a_localized |
| 100 | +# DISCARD-NEXT: NOTYPE LOCAL HIDDEN [[#]] a_hidden |
| 101 | +# DISCARD-NEXT: NOTYPE LOCAL DEFAULT [[#]] b_localized |
| 102 | +# DISCARD-NEXT: NOTYPE LOCAL HIDDEN [[#]] _DYNAMIC |
| 103 | +# DISCARD-NEXT: NOTYPE GLOBAL DEFAULT [[#]] a_exported |
| 104 | +# DISCARD-NEXT: NOTYPE GLOBAL DEFAULT [[#]] b_exported |
| 105 | + |
| 106 | +#--- a.s |
| 107 | +a_local: |
| 108 | +.globl a_localized |
| 109 | +a_localized: |
| 110 | +.globl a_hidden |
| 111 | +.hidden a_hidden |
| 112 | +a_hidden: |
| 113 | +.globl a_exported |
| 114 | +a_exported: |
| 115 | + nop |
| 116 | + |
| 117 | +#--- b.s |
| 118 | +.file "b.c" |
| 119 | +.data |
| 120 | +b_local: |
| 121 | +.globl b_localized |
| 122 | +b_localized: |
| 123 | +.globl b_exported |
| 124 | +b_exported: |
| 125 | + .byte 0 |
| 126 | + |
| 127 | +#--- c.s |
| 128 | +.globl _start, c_hidden |
| 129 | +.hidden c_hidden |
| 130 | +_start: |
| 131 | + bl far |
| 132 | +c_hidden: |
| 133 | + ret |
| 134 | +.section .far,"ax" |
| 135 | +far: |
| 136 | + ret |
| 137 | + |
| 138 | +#--- lds |
| 139 | +SECTIONS { |
| 140 | + .text 0x10000 : { *(.text) } |
| 141 | + .far 0x10000000 : { *(.far) } |
| 142 | +} |
| 143 | + |
| 144 | +#--- ver |
| 145 | +v1 { global: *_exported; local: *; }; |
0 commit comments