--- /dev/null
+## This test checks updating a dynamic shared library ID in a MachO binary.
+
+# RUN: yaml2obj %s --docnum=1 -o %t
+
+## Specifying -id once:
+# RUN: llvm-install-name-tool -id /usr/lib/A_long_long_test %t
+# RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=ID --implicit-check-not=/usr
+
+# ID: /usr/lib/A_long_long_test
+
+## Specifying -id more than once:
+# RUN: llvm-install-name-tool -id /usr/lib/B_long -id /usr/lib/K_long -id /usr/A_short %t
+# RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=ID-MULTIPLE --implicit-check-not=/usr
+
+# ID-MULTIPLE: /usr/A_short
+
+## Specifying -id with empty string:
+# RUN: not llvm-install-name-tool -id '' %t 2>&1 | \
+# RUN: FileCheck %s --check-prefix=EMPTY
+
+# EMPTY: cannot specify an empty id
+
+## Missing id argument:
+# RUN: not llvm-install-name-tool %t -id 2>&1 | \
+# RUN: FileCheck %s --check-prefix=MISSING
+
+# MISSING: missing argument to -id option
+
+## Shared dylib binary
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000006
+ ncmds: 1
+ sizeofcmds: 56
+ flags: 0x00002000
+ reserved: 0x00000000
+LoadCommands:
+ - cmd: LC_ID_DYLIB
+ cmdsize: 56
+ dylib:
+ name: 24
+ timestamp: 2
+ current_version: 82115073
+ compatibility_version: 65536
+ PayloadString: '/usr/lib/A'
+
+# RUN: yaml2obj %s --docnum=2 -o %t
+
+## Check that -id option has no effect if binary is not a shared dylib:
+# RUN: cp %t %t1
+# RUN: llvm-install-name-tool -id /usr/lib/J %t
+# RUN: cmp %t %t1
+
+## Executable binary
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00002000
+ reserved: 0x00000000
Config.RPathsToUpdate.emplace_back(Old, New);
}
+ if (auto *Arg = InputArgs.getLastArg(INSTALL_NAME_TOOL_id))
+ Config.SharedLibId = Arg->getValue();
+
SmallVector<StringRef, 2> Positional;
for (auto Arg : InputArgs.filtered(INSTALL_NAME_TOOL_UNKNOWN))
return createStringError(errc::invalid_argument, "unknown argument '%s'",
std::vector<std::pair<StringRef, StringRef>> RPathsToUpdate;
DenseSet<StringRef> RPathsToRemove;
+ // install-name-tool's id option
+ Optional<StringRef> SharedLibId;
+
// Section matchers
NameMatcher KeepSection;
NameMatcher OnlySection;
def rpath: MultiArg<["-", "--"], "rpath", 2>,
HelpText<"Change rpath path name">;
+def id : Option<["-","--"], "id", KIND_SEPARATE>,
+ HelpText<"Change dynamic shared library id">;
+
def version : Flag<["--"], "version">,
HelpText<"Print the version and exit.">;
for (std::unique_ptr<Section> &Sec : LC.Sections)
Sec->Relocations.clear();
+ if (Config.SharedLibId) {
+ StringRef Id = Config.SharedLibId.getValue();
+ if (Id.empty())
+ return createStringError(errc::invalid_argument,
+ "cannot specify an empty id");
+ for (LoadCommand &LC : Obj.LoadCommands) {
+ if (LC.MachOLoadCommand.load_command_data.cmd == MachO::LC_ID_DYLIB) {
+ updateLoadCommandPayloadString<MachO::dylib_command>(LC, Id);
+ break;
+ }
+ }
+ }
+
for (const auto &Flag : Config.AddSection) {
std::pair<StringRef, StringRef> SecPair = Flag.split("=");
StringRef SecName = SecPair.first;