Skip to content

Commit

Permalink
[lld-macho]Use install_name as Identifier for code-sign, if available.
Browse files Browse the repository at this point in the history
Detail:
LD64 uses the name provided via  -[dylib]install_name as "Identifier", when available.
For compatiblity, LLD should do that too.

Differential Revision: https://reviews.llvm.org/D155508
  • Loading branch information
oontvoo committed Jul 19, 2023
1 parent a37d747 commit 642ffbb
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
11 changes: 9 additions & 2 deletions lld/MachO/SyntheticSections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1460,8 +1460,15 @@ static_assert((CodeSignatureSection::fixedHeadersSize % 8) == 0);
CodeSignatureSection::CodeSignatureSection()
: LinkEditSection(segment_names::linkEdit, section_names::codeSignature) {
align = 16; // required by libstuff
// FIXME: Consider using finalOutput instead of outputFile.
fileName = config->outputFile;

// XXX: This mimics LD64, where it uses the install-name as codesign
// identifier, if available.
if (!config->installName.empty())
fileName = config->installName;
else
// FIXME: Consider using finalOutput instead of outputFile.
fileName = config->outputFile;

size_t slashIndex = fileName.rfind("/");
if (slashIndex != std::string::npos)
fileName = fileName.drop_front(slashIndex + 1);
Expand Down
19 changes: 19 additions & 0 deletions lld/test/MachO/adhoc-codesign.s
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,30 @@
# RUN: %no-arg-lld -arch arm64 -platform_version ios-simulator 14.0 15.0 -bundle -no_adhoc_codesign -o %t/out %t/foo-arm64-sim.o
# RUN: llvm-objdump --macho --all-headers %t/out| FileCheck --check-prefix=NO-ADHOC %s

# RUN: %lld -arch x86_64 -dylib -o %t/out_installname.dylib -install_name @rpath/MyInstallName %t/foo-x86_64-macos.o -adhoc_codesign
# RUN: %lld -arch x86_64 -dylib -o %t/out_no_installname.dylib %t/foo-x86_64-macos.o -adhoc_codesign

## Smoke check to verify the dataoff and datasize value before using them with code-signature-check.py
# RUN: llvm-objdump --macho --all-headers %t/out_installname.dylib | FileCheck %s --check-prefix CS-ID-PRE -D#DATA_OFFSET=4176 -D#DATA_SIZE=192
# RUN: llvm-objdump --macho --all-headers %t/out_no_installname.dylib | FileCheck %s --check-prefix CS-ID-PRE -D#DATA_OFFSET=4176 -D#DATA_SIZE=208

## Verify that the 'Identifier' (aka 'Code Directory ID') field are set to the install-name, if available.
# RUN: %python %p/Inputs/code-signature-check.py %t/out_installname.dylib 4176 192 0 4176 | FileCheck %s --check-prefix CS-ID-INSTALL
# RUN: %python %p/Inputs/code-signature-check.py %t/out_no_installname.dylib 4176 208 0 4176 | FileCheck %s --check-prefix CS-ID-NO-INSTALL

# ADHOC: cmd LC_CODE_SIGNATURE
# ADHOC-NEXT: cmdsize 16

# NO-ADHOC-NOT: cmd LC_CODE_SIGNATURE

# CS-ID-PRE: cmd LC_CODE_SIGNATURE
# CS-ID-PRE-NEXT: cmdsize 16
# CS-ID-PRE-NEXT: dataoff [[#DATA_OFFSET]]
# CS-ID-PRE-NEXT: datasize [[#DATA_SIZE]]

# CS-ID-INSTALL: Code Directory ID: MyInstallName
# CS-ID-NO-INSTALL: Code Directory ID: out_no_installname.dylib

#--- foo.s
.globl _foo
_foo:
Expand Down

0 comments on commit 642ffbb

Please sign in to comment.