mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
[mach-o] add representation for LC_ID_DYLIB to MachONormalizedFile
It still needs to be tied into BinaryReader, but this allows reasonably sensible creation of SharedLibrary atoms on MachO. llvm-svn: 212093
This commit is contained in:
parent
012dff0b23
commit
301c4e690a
@ -386,6 +386,15 @@ readBinary(std::unique_ptr<MemoryBuffer> &mb,
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cmd == LC_ID_DYLIB) {
|
||||
const dylib_command *dl = reinterpret_cast<const dylib_command*>(lc);
|
||||
dylib_command tempDL;
|
||||
if (swap) {
|
||||
tempDL = *dl; swapStruct(tempDL); dl = &tempDL;
|
||||
}
|
||||
|
||||
f->installName = lc + dl->dylib.name;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (ec)
|
||||
|
@ -324,6 +324,12 @@ uint32_t MachOFileLayout::loadCommandsSize(uint32_t &count) {
|
||||
size += segCommandSize;
|
||||
++count;
|
||||
|
||||
// If creating a dylib, add LC_ID_DYLIB.
|
||||
if (_file.fileType == llvm::MachO::MH_DYLIB) {
|
||||
size += sizeof(dylib_command) + pointerAlign(_file.installName.size() + 1);
|
||||
++count;
|
||||
}
|
||||
|
||||
// Add LC_DYLD_INFO
|
||||
size += sizeof(dyld_info_command);
|
||||
++count;
|
||||
@ -621,6 +627,24 @@ std::error_code MachOFileLayout::writeLoadCommands() {
|
||||
else
|
||||
ec = writeSegmentLoadCommands<MachO32Trait>(lc);
|
||||
|
||||
// Add LC_ID_DYLIB command for dynamic libraries.
|
||||
if (_file.fileType == llvm::MachO::MH_DYLIB) {
|
||||
dylib_command *dc = reinterpret_cast<dylib_command*>(lc);
|
||||
StringRef path = _file.installName;
|
||||
uint32_t size = sizeof(dylib_command) + pointerAlign(path.size() + 1);
|
||||
dc->cmd = LC_ID_DYLIB;
|
||||
dc->cmdsize = size;
|
||||
dc->dylib.name = sizeof(dylib_command); // offset
|
||||
dc->dylib.timestamp = 0; // FIXME
|
||||
dc->dylib.current_version = 0; // FIXME
|
||||
dc->dylib.compatibility_version = 0; // FIXME
|
||||
if (_swap)
|
||||
swapStruct(*dc);
|
||||
memcpy(lc + sizeof(dylib_command), path.begin(), path.size());
|
||||
lc[sizeof(dylib_command) + path.size()] = '\0';
|
||||
lc += size;
|
||||
}
|
||||
|
||||
// Add LC_DYLD_INFO_ONLY.
|
||||
dyld_info_command* di = reinterpret_cast<dyld_info_command*>(lc);
|
||||
di->cmd = LC_DYLD_INFO_ONLY;
|
||||
@ -720,7 +744,6 @@ std::error_code MachOFileLayout::writeLoadCommands() {
|
||||
lc[sizeof(dylib_command)+dep.path.size()] = '\0';
|
||||
lc += size;
|
||||
}
|
||||
|
||||
}
|
||||
return ec;
|
||||
}
|
||||
|
@ -934,6 +934,7 @@ normalizedFromAtoms(const lld::File &atomFile,
|
||||
f->arch = context.arch();
|
||||
f->fileType = context.outputMachOType();
|
||||
f->flags = util.fileFlags();
|
||||
f->installName = context.installName();
|
||||
util.copySegmentInfo(normFile);
|
||||
util.copySections(normFile);
|
||||
util.addDependentDylibs(atomFile, normFile);
|
||||
|
@ -605,7 +605,8 @@ normalizedObjectToAtoms(const NormalizedFile &normalizedFile, StringRef path,
|
||||
ErrorOr<std::unique_ptr<lld::File>>
|
||||
normalizedDylibToAtoms(const NormalizedFile &normalizedFile, StringRef path,
|
||||
bool copyRefs) {
|
||||
std::unique_ptr<MachODylibFile> file(new MachODylibFile(path));
|
||||
std::unique_ptr<MachODylibFile> file(
|
||||
new MachODylibFile(normalizedFile.installName));
|
||||
|
||||
for (auto &sym : normalizedFile.globalSymbols) {
|
||||
assert((sym.scope & N_EXT) && "only expect external symbols here");
|
||||
|
@ -508,7 +508,6 @@ struct MappingTraits<DependentDylib> {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <>
|
||||
struct ScalarEnumerationTraits<RebaseType> {
|
||||
static void enumeration(IO &io, RebaseType &value) {
|
||||
|
28
lld/test/mach-o/Inputs/use-dylib-install-names.yaml
Normal file
28
lld/test/mach-o/Inputs/use-dylib-install-names.yaml
Normal file
@ -0,0 +1,28 @@
|
||||
--- !mach-o
|
||||
arch: x86_64
|
||||
file-type: MH_OBJECT
|
||||
flags: [ ]
|
||||
has-UUID: false
|
||||
OS: unknown
|
||||
sections:
|
||||
- segment: __TEXT
|
||||
section: __text
|
||||
type: S_REGULAR
|
||||
attributes: [ S_ATTR_PURE_INSTRUCTIONS ]
|
||||
address: 0x0000000000000000
|
||||
content: [ 0x55, 0x48, 0x89, 0xE5, 0xE8, 0x00, 0x00, 0x00,
|
||||
0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x00,
|
||||
0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00,
|
||||
0xE8, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xE9, 0x00,
|
||||
0x00, 0x00, 0x00 ]
|
||||
global-symbols:
|
||||
- name: _foo
|
||||
type: N_SECT
|
||||
scope: [ N_EXT ]
|
||||
sect: 1
|
||||
value: 0x0000000000000000
|
||||
undefined-symbols:
|
||||
- name: _myGlobal
|
||||
type: N_UNDF
|
||||
scope: [ N_EXT ]
|
||||
value: 0x0000000000000000
|
41
lld/test/mach-o/dylib-install-names.yaml
Normal file
41
lld/test/mach-o/dylib-install-names.yaml
Normal file
@ -0,0 +1,41 @@
|
||||
# RUN: lld -flavor darwin -arch x86_64 -install_name libwibble.dylib -dylib %s -o %t.dylib
|
||||
# RUN: macho-dump %t.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
|
||||
# RUN: lld -flavor darwin -arch x86_64 %p/Inputs/use-dylib-install-names.yaml %t.dylib -r -print_atoms | FileCheck %s --check-prefix=CHECK-BINARY-READ
|
||||
|
||||
--- !mach-o
|
||||
arch: x86_64
|
||||
file-type: MH_OBJECT
|
||||
flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
|
||||
has-UUID: false
|
||||
OS: unknown
|
||||
sections:
|
||||
- segment: __TEXT
|
||||
section: __text
|
||||
type: S_REGULAR
|
||||
attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
|
||||
alignment: 4
|
||||
address: 0x0000000000000000
|
||||
content: [ 0xCC, 0xC3, 0x90, 0xC3, 0x90, 0x90, 0xC3, 0x90,
|
||||
0x90, 0x90, 0xC3, 0x90, 0x90, 0x90, 0x90, 0xC3,
|
||||
0x31, 0xC0, 0xC3 ]
|
||||
local-symbols:
|
||||
- name: _myStatic
|
||||
type: N_SECT
|
||||
sect: 1
|
||||
value: 0x000000000000000B
|
||||
global-symbols:
|
||||
- name: _myGlobal
|
||||
type: N_SECT
|
||||
scope: [ N_EXT ]
|
||||
sect: 1
|
||||
value: 0x0000000000000001
|
||||
...
|
||||
|
||||
|
||||
# CHECK-BINARY-WRITE: (('command', 13)
|
||||
# CHECK-BINARY-WRITE-NEXT: ('size', 40)
|
||||
# CHECK-BINARY-WRITE-NEXT: ('install_name', 'libwibble.dylib')
|
||||
|
||||
# CHECK-BINARY-READ: shared-library-atoms:
|
||||
# CHECK-BINARY-READ: - name: _myGlobal
|
||||
# CHECK-BINARY-READ: load-name: libwibble.dylib
|
@ -1,3 +1,4 @@
|
||||
|
||||
# mach-o test cases encode input files in yaml and use .yaml extension
|
||||
config.suffixes = ['.yaml']
|
||||
config.excludes = ['Inputs']
|
||||
|
@ -1,5 +1,5 @@
|
||||
# RUN: lld -flavor darwin -arch x86_64 -print_atoms -r %s | FileCheck %s
|
||||
# lld -flavor darwin -arch x86_64 -print_atoms -r %s %p/Inputs/simple-dylib.yaml -o - | FileCheck %s
|
||||
|
||||
|
||||
--- !mach-o
|
||||
arch: x86_64
|
||||
@ -110,6 +110,8 @@ global-symbols:
|
||||
sect: 1
|
||||
desc: [ N_SYMBOL_RESOLVER ]
|
||||
value: 0x0000000000000010
|
||||
|
||||
install-name: libspecial.dylib
|
||||
...
|
||||
|
||||
|
||||
@ -118,12 +120,12 @@ global-symbols:
|
||||
# CHECK: - name: _myVariablePreviouslyKnownAsPrivateExtern
|
||||
# CHECK: shared-library-atoms:
|
||||
# CHECK: - name: _myHidden
|
||||
# CHECK: load-name: {{.*}}use-simple-dylib.yaml
|
||||
# CHECK: load-name: libspecial.dylib
|
||||
# CHECK: - name: _myGlobal
|
||||
# CHECK: load-name: {{.*}}use-simple-dylib.yaml
|
||||
# CHECK: load-name: libspecial.dylib
|
||||
# CHECK: - name: _myHiddenWeak
|
||||
# CHECK: load-name: {{.*}}use-simple-dylib.yaml
|
||||
# CHECK: load-name: libspecial.dylib
|
||||
# CHECK: - name: _myGlobalWeak
|
||||
# CHECK: load-name: {{.*}}use-simple-dylib.yaml
|
||||
# CHECK: load-name: libspecial.dylib
|
||||
# CHECK: - name: _myResolver
|
||||
# CHECK: load-name: {{.*}}use-simple-dylib.yaml
|
||||
# CHECK: load-name: libspecial.dylib
|
||||
|
Loading…
Reference in New Issue
Block a user