| ## This test checks updating a LC_RPATH load command in a MachO binary. |
| |
| # RUN: yaml2obj %s -o %t |
| |
| ## Updating a single RPath entry: |
| # RUN: llvm-install-name-tool -rpath @executable_a/. @executable_A/. %t |
| # RUN: llvm-objdump -p %t | \ |
| # RUN: FileCheck %s --check-prefix=RPATHS --implicit-check-not=@executable |
| |
| # RPATHS: @executable_A/. |
| # RPATHS: @executable_short_test |
| # RPATHS: @executable_long_test/. |
| # RPATHS: @executable_d/. |
| |
| ## Updating multiple RPath entries: |
| # RUN: llvm-install-name-tool -rpath @executable_short_test/. @executable_test/. \ |
| # RUN: -rpath @executable_long_test/. @executable_long_long_test/. %t |
| # RUN: llvm-objdump -p %t | \ |
| # RUN: FileCheck %s --check-prefix=RPATHS-MULTIPLE --implicit-check-not=@executable |
| |
| # RPATHS-MULTIPLE: @executable_A/. |
| # RPATHS-MULTIPLE: @executable_test/. |
| # RPATHS-MULTIPLE: @executable_long_long_test/. |
| # RPATHS-MULTIPLE: @executable_d/. |
| |
| ## Check that cmdsize accounts for NULL terminator: |
| # RUN: llvm-install-name-tool -rpath @executable_A/. ABCD %t |
| # RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=RPATH-SIZE |
| |
| # RPATH-SIZE: cmd LC_RPATH |
| # RPATH-SIZE-NEXT: cmdsize 24 |
| # RPATH-SIZE-NEXT: path ABCD |
| |
| ## Updating and adding different RPaths: |
| # RUN: llvm-install-name-tool -rpath @executable_d/. @executable_D/. \ |
| # RUN: -add_rpath @executable_e/. %t |
| # RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=RPATHS-ADD --implicit-check-not=@executable |
| |
| # RPATHS-ADD: ABCD |
| # RPATHS-ADD: @executable_test/. |
| # RPATHS-ADD: @executable_long_long_test/. |
| # RPATHS-ADD: @executable_D/. |
| # RPATHS-ADD: @executable_e/. |
| |
| ## Updating and deleting different RPaths: |
| # RUN: llvm-install-name-tool -rpath @executable_D/. @executable_d/. \ |
| # RUN: -delete_rpath @executable_e/. %t |
| # RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=RPATHS-DELETE --implicit-check-not=@executable |
| |
| # RPATHS-DELETE: ABCD |
| # RPATHS-DELETE: @executable_test/. |
| # RPATHS-DELETE: @executable_long_long_test/. |
| # RPATHS-DELETE: @executable_d/. |
| |
| # RUN: cp %t %t1 |
| |
| ## Updating multiple RPath entries where one exists and the other doesn't: |
| # RUN: not llvm-install-name-tool -rpath @executable_test/. @executable/. \ |
| # RUN: -rpath @executable_long_test/. @executable_long_longest/. %t 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=RPATHS-FAIL |
| # RUN: cmp %t %t1 |
| |
| # RPATHS-FAIL: no LC_RPATH load command with path: @executable_long_test/. |
| |
| ## Updating a nonexistent RPath: |
| # RUN: not llvm-install-name-tool -rpath @executable_a/. @executable_AA/. %t 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=ABSENT-RPATH |
| # RUN: cmp %t %t1 |
| |
| # ABSENT-RPATH: no LC_RPATH load command with path: @executable_a/. |
| |
| ## Updating to an existing RPath: |
| # RUN: not llvm-install-name-tool -rpath @executable_d/. ABCD %t 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=EXISTING |
| # RUN: cmp %t %t1 |
| |
| # EXISTING: rpath 'ABCD' would create a duplicate load command |
| |
| ## Duplicate RPath entries: |
| # RUN: not llvm-install-name-tool -rpath DDD1/. @exec_d/. \ |
| # RUN: -rpath @exec_d/. DDD2/. %t 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=DUPLICATE |
| # RUN: cmp %t %t1 |
| |
| # DUPLICATE: cannot specify both -rpath 'DDD1/.' '@exec_d/.' and -rpath '@exec_d/.' 'DDD2/.' |
| |
| ## Updating and deleting RPath at the same time: |
| # RUN: not llvm-install-name-tool -rpath @executable_d/. DD/. \ |
| # RUN: -delete_rpath @executable_d/. %t 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=COMBINED-DELETE |
| # RUN: cmp %t %t1 |
| |
| # COMBINED-DELETE: cannot specify both -delete_rpath '@executable_d/.' and -rpath '@executable_d/.' 'DD/.' |
| |
| ## Updating and adding RPath at the same time: |
| # RUN: not llvm-install-name-tool -rpath @executable_e/. EE/. \ |
| # RUN: -add_rpath @executable_e/. %t 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=COMBINED-ADD |
| # RUN: cmp %t %t1 |
| |
| # COMBINED-ADD: cannot specify both -add_rpath '@executable_e/.' and -rpath '@executable_e/.' 'EE/.' |
| |
| ## Missing an RPath argument: |
| # RUN: not llvm-install-name-tool %t -rpath @executable_e/. 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=MISSING |
| # RUN: cmp %t %t1 |
| |
| ## Missing both RPath arguments: |
| # RUN: not llvm-install-name-tool %t -rpath 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=MISSING |
| # RUN: cmp %t %t1 |
| |
| # MISSING: missing argument to -rpath option |
| |
| |
| --- !mach-o |
| FileHeader: |
| magic: 0xFEEDFACF |
| cputype: 0x01000007 |
| cpusubtype: 0x00000003 |
| filetype: 0x00000001 |
| ncmds: 4 |
| sizeofcmds: 144 |
| flags: 0x00002000 |
| reserved: 0x00000000 |
| LoadCommands: |
| - cmd: LC_RPATH |
| cmdsize: 32 |
| path: 12 |
| Content: '@executable_a/.' |
| - cmd: LC_RPATH |
| cmdsize: 40 |
| path: 12 |
| Content: '@executable_short_test/.' |
| - cmd: LC_RPATH |
| cmdsize: 40 |
| path: 12 |
| Content: '@executable_long_test/.' |
| - cmd: LC_RPATH |
| cmdsize: 32 |
| path: 12 |
| Content: '@executable_d/.' |