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