1## This test checks updating a LC_RPATH load command in a MachO binary.
2
3# RUN: yaml2obj %s -o %t
4
5## Updating a single RPath entry:
6# RUN: llvm-install-name-tool -rpath @executable_a/. @executable_A/. %t
7# RUN: llvm-objdump -p %t | \
8# RUN:   FileCheck %s --check-prefix=RPATHS --implicit-check-not=@executable
9
10# RPATHS: @executable_A/.
11# RPATHS: @executable_short_test
12# RPATHS: @executable_long_test/.
13# RPATHS: @executable_d/.
14
15## Updating multiple RPath entries:
16# RUN: llvm-install-name-tool -rpath @executable_short_test/. @executable_test/. \
17# RUN:                        -rpath @executable_long_test/. @executable_long_long_test/. %t
18# RUN: llvm-objdump -p %t | \
19# RUN:   FileCheck %s --check-prefix=RPATHS-MULTIPLE --implicit-check-not=@executable
20
21# RPATHS-MULTIPLE: @executable_A/.
22# RPATHS-MULTIPLE: @executable_test/.
23# RPATHS-MULTIPLE: @executable_long_long_test/.
24# RPATHS-MULTIPLE: @executable_d/.
25
26## Check that cmdsize accounts for NULL terminator:
27# RUN: llvm-install-name-tool -rpath @executable_A/. ABCD %t
28# RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=RPATH-SIZE
29
30# RPATH-SIZE:      cmd LC_RPATH
31# RPATH-SIZE-NEXT: cmdsize 24
32# RPATH-SIZE-NEXT: path ABCD
33
34## Updating and adding different RPaths:
35# RUN: llvm-install-name-tool -rpath @executable_d/. @executable_D/. \
36# RUN:                        -add_rpath @executable_e/. %t
37# RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=RPATHS-ADD --implicit-check-not=@executable
38
39# RPATHS-ADD: ABCD
40# RPATHS-ADD: @executable_test/.
41# RPATHS-ADD: @executable_long_long_test/.
42# RPATHS-ADD: @executable_D/.
43# RPATHS-ADD: @executable_e/.
44
45## Updating and deleting different RPaths:
46# RUN: llvm-install-name-tool -rpath @executable_D/. @executable_d/. \
47# RUN:                        -delete_rpath @executable_e/. %t
48# RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=RPATHS-DELETE --implicit-check-not=@executable
49
50# RPATHS-DELETE: ABCD
51# RPATHS-DELETE: @executable_test/.
52# RPATHS-DELETE: @executable_long_long_test/.
53# RPATHS-DELETE: @executable_d/.
54
55# RUN: cp %t %t1
56
57## Updating multiple RPath entries where one exists and the other doesn't:
58# RUN: not llvm-install-name-tool -rpath @executable_test/. @executable/. \
59# RUN:                            -rpath @executable_long_test/. @executable_long_longest/. %t 2>&1 | \
60# RUN:   FileCheck %s --check-prefix=RPATHS-FAIL
61# RUN: cmp %t %t1
62
63# RPATHS-FAIL: no LC_RPATH load command with path: @executable_long_test/.
64
65## Updating a nonexistent RPath:
66# RUN: not llvm-install-name-tool -rpath @executable_a/. @executable_AA/. %t 2>&1 | \
67# RUN:   FileCheck %s --check-prefix=ABSENT-RPATH
68# RUN: cmp %t %t1
69
70# ABSENT-RPATH: no LC_RPATH load command with path: @executable_a/.
71
72## Updating to an existing RPath:
73# RUN: not llvm-install-name-tool -rpath @executable_d/. ABCD %t 2>&1 | \
74# RUN:   FileCheck %s --check-prefix=EXISTING
75# RUN: cmp %t %t1
76
77# EXISTING: rpath 'ABCD' would create a duplicate load command
78
79## Duplicate RPath entries:
80# RUN: not llvm-install-name-tool -rpath DDD1/. @exec_d/. \
81# RUN:                            -rpath @exec_d/. DDD2/. %t 2>&1 | \
82# RUN:   FileCheck %s --check-prefix=DUPLICATE
83# RUN: cmp %t %t1
84
85# DUPLICATE: cannot specify both -rpath 'DDD1/.' '@exec_d/.' and -rpath '@exec_d/.' 'DDD2/.'
86
87## Updating and deleting RPath at the same time:
88# RUN: not llvm-install-name-tool -rpath @executable_d/. DD/. \
89# RUN:                            -delete_rpath @executable_d/. %t 2>&1 | \
90# RUN:   FileCheck %s --check-prefix=COMBINED-DELETE
91# RUN: cmp %t %t1
92
93# COMBINED-DELETE: cannot specify both -delete_rpath '@executable_d/.' and -rpath '@executable_d/.' 'DD/.'
94
95## Updating and adding RPath at the same time:
96# RUN: not llvm-install-name-tool -rpath @executable_e/. EE/. \
97# RUN:                            -add_rpath @executable_e/. %t 2>&1 | \
98# RUN:   FileCheck %s --check-prefix=COMBINED-ADD
99# RUN: cmp %t %t1
100
101# COMBINED-ADD: cannot specify both -add_rpath '@executable_e/.' and -rpath '@executable_e/.' 'EE/.'
102
103## Missing an RPath argument:
104# RUN: not llvm-install-name-tool %t -rpath @executable_e/. 2>&1 | \
105# RUN:   FileCheck %s --check-prefix=MISSING
106# RUN: cmp %t %t1
107
108## Missing both RPath arguments:
109# RUN: not llvm-install-name-tool %t -rpath 2>&1 | \
110# RUN:   FileCheck %s --check-prefix=MISSING
111# RUN: cmp %t %t1
112
113# MISSING: missing argument to -rpath option
114
115
116--- !mach-o
117FileHeader:
118  magic:           0xFEEDFACF
119  cputype:         0x01000007
120  cpusubtype:      0x00000003
121  filetype:        0x00000001
122  ncmds:           4
123  sizeofcmds:      144
124  flags:           0x00002000
125  reserved:        0x00000000
126LoadCommands:
127  - cmd:             LC_RPATH
128    cmdsize:         32
129    path:            12
130    PayloadString:   '@executable_a/.'
131  - cmd:             LC_RPATH
132    cmdsize:         40
133    path:            12
134    PayloadString:   '@executable_short_test/.'
135  - cmd:             LC_RPATH
136    cmdsize:         40
137    path:            12
138    PayloadString:   '@executable_long_test/.'
139  - cmd:             LC_RPATH
140    cmdsize:         32
141    path:            12
142    PayloadString:   '@executable_d/.'
143