forked from OSchip/llvm-project
[macho] Minor install_name fixes
Summary: Fix the binary file reader to properly read dyld version info. Update the install_name test case to properly test the binary reader. We can't use '-print_atoms' as the output format is 'native' yaml and it does not contains the dyld current and compatibility versions. Also change the timestamp value of LD_ID_DYLD to match the one generated by ld64. The dynamic linker (dyld) used to expects different values for timestamp in LD_ID_DYLD and LD_LOAD_DYLD for prebound images. While prebinding is deprecated, we should probably keep it safe and match ld64. Reviewers: kledzik Subscribers: llvm-commits Projects: #lld Differential Revision: http://reviews.llvm.org/D6736 llvm-svn: 224681
This commit is contained in:
parent
968a21de24
commit
edefcccd46
|
|
@ -437,6 +437,8 @@ readBinary(std::unique_ptr<MemoryBuffer> &mb,
|
|||
case LC_ID_DYLIB: {
|
||||
const dylib_command *dl = reinterpret_cast<const dylib_command*>(lc);
|
||||
f->installName = lc + read32(&dl->dylib.name, isBig);
|
||||
f->currentVersion = read32(&dl->dylib.current_version, isBig);
|
||||
f->compatVersion = read32(&dl->dylib.compatibility_version, isBig);
|
||||
}
|
||||
break;
|
||||
case LC_DATA_IN_CODE: {
|
||||
|
|
|
|||
|
|
@ -741,7 +741,8 @@ std::error_code MachOFileLayout::writeLoadCommands() {
|
|||
dc->cmd = LC_ID_DYLIB;
|
||||
dc->cmdsize = size;
|
||||
dc->dylib.name = sizeof(dylib_command); // offset
|
||||
dc->dylib.timestamp = 2;
|
||||
// needs to be some constant value different than the one in LC_LOAD_DYLIB
|
||||
dc->dylib.timestamp = 1;
|
||||
dc->dylib.current_version = _file.currentVersion;
|
||||
dc->dylib.compatibility_version = _file.compatVersion;
|
||||
if (_swap)
|
||||
|
|
@ -841,6 +842,7 @@ std::error_code MachOFileLayout::writeLoadCommands() {
|
|||
dc->cmd = dep.kind;
|
||||
dc->cmdsize = size;
|
||||
dc->dylib.name = sizeof(dylib_command); // offset
|
||||
// needs to be some constant value different than the one in LC_ID_DYLIB
|
||||
dc->dylib.timestamp = 2;
|
||||
dc->dylib.current_version = dep.currentVersion;
|
||||
dc->dylib.compatibility_version = dep.compatVersion;
|
||||
|
|
|
|||
|
|
@ -2,24 +2,25 @@
|
|||
# RUN: lld -flavor darwin -arch x86_64 -install_name libwibble.dylib -dylib \
|
||||
# RUN: -compatibility_version 2.0 -current_version 5.3 \
|
||||
# RUN: %p/Inputs/libSystem.yaml %s -o %t.dylib
|
||||
# RUN: macho-dump %t.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
|
||||
# RUN: llvm-objdump -private-headers %t.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
|
||||
|
||||
# Check we read LC_ID_DYLIB correctly:
|
||||
# RUN: lld -flavor darwin -arch x86_64 %p/Inputs/use-dylib-install-names.yaml \
|
||||
# RUN: %t.dylib -r -print_atoms | FileCheck %s --check-prefix=CHECK-BINARY-READ
|
||||
# RUN: %p/Inputs/libSystem.yaml %t.dylib -dylib -o %t2.dylib
|
||||
# RUN: llvm-objdump -private-headers %t2.dylib | FileCheck %s --check-prefix=CHECK-BINARY-READ
|
||||
|
||||
# Check we default the install-name to the output file:
|
||||
# RUN: lld -flavor darwin -arch x86_64 -dylib %s -o libwibble.dylib \
|
||||
# RUN: -compatibility_version 2.0 -current_version 5.3 \
|
||||
# RUN: %p/Inputs/libSystem.yaml
|
||||
# RUN: macho-dump libwibble.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
|
||||
# RUN: llvm-objdump -private-headers libwibble.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
|
||||
# RUN: rm -f libwibble.dylib
|
||||
|
||||
# Check -single_module does nothing
|
||||
# RUN: lld -flavor darwin -arch x86_64 -dylib %s -install_name libwibble.dylib \
|
||||
# RUN: -compatibility_version 2.0 -current_version 5.3 \
|
||||
# RUN: -single_module -o %t2.dylib %p/Inputs/libSystem.yaml
|
||||
# RUN: macho-dump %t2.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
|
||||
# RUN: llvm-objdump -private-headers %t2.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
|
||||
|
||||
--- !mach-o
|
||||
arch: x86_64
|
||||
|
|
@ -51,13 +52,23 @@ global-symbols:
|
|||
...
|
||||
|
||||
|
||||
# CHECK-BINARY-WRITE: (('command', 13)
|
||||
# CHECK-BINARY-WRITE-NEXT: ('size', 40)
|
||||
# CHECK-BINARY-WRITE-NEXT: ('install_name', 'libwibble.dylib')
|
||||
# CHECK-BINARY-WRITE-NEXT: ('timestamp,
|
||||
# CHECK-BINARY-WRITE-NEXT: ('cur_version, 328448)
|
||||
# CHECK-BINARY-WRITE-NEXT: ('compat_version, 131072)
|
||||
# CHECK-BINARY-WRITE: cmd LC_ID_DYLIB
|
||||
# CHECK-BINARY-WRITE-NEXT: cmdsize 40
|
||||
# CHECK-BINARY-WRITE-NEXT: name libwibble.dylib (offset 24)
|
||||
# CHECK-BINARY-WRITE-NEXT: time stamp 1
|
||||
# CHECK-BINARY-WRITE-NEXT: current version 5.3.0
|
||||
# CHECK-BINARY-WRITE-NEXT: compatibility version 2.0.0
|
||||
|
||||
# CHECK-BINARY-READ: shared-library-atoms:
|
||||
# CHECK-BINARY-READ: - name: _myGlobal
|
||||
# CHECK-BINARY-READ: load-name: libwibble.dylib
|
||||
# CHECK-BINARY-READ: cmd LC_LOAD_DYLIB
|
||||
# CHECK-BINARY-READ-NEXT: cmdsize 56
|
||||
# CHECK-BINARY-READ-NEXT: name /usr/lib/libSystem.B.dylib (offset 24)
|
||||
# CHECK-BINARY-READ-NEXT: time stamp 2
|
||||
# CHECK-BINARY-READ-NEXT: current version 0.16.0
|
||||
# CHECK-BINARY-READ-NEXT: compatibility version 0.16.0
|
||||
|
||||
# CHECK-BINARY-READ: cmd LC_LOAD_DYLIB
|
||||
# CHECK-BINARY-READ-NEXT: cmdsize 40
|
||||
# CHECK-BINARY-READ-NEXT: name libwibble.dylib (offset 24)
|
||||
# CHECK-BINARY-READ-NEXT: time stamp 2
|
||||
# CHECK-BINARY-READ-NEXT: current version 5.3.0
|
||||
# CHECK-BINARY-READ-NEXT: compatibility version 2.0.0
|
||||
|
|
|
|||
Loading…
Reference in New Issue