[ObjectYAML/obj2yaml/yaml2obj][MachO] Support indirect symbol table

Tools such as `llvm-objdump` or `llvm-readobj` support indirect symbol
tables. Here, support it for `obj2yaml` and `yaml2obj`.

Reviewed By: jhenderson, drodriguez

Differential Revision: https://reviews.llvm.org/D114410
This commit is contained in:
Vincent Lee 2021-11-22 19:56:56 -08:00
parent 41a681ce09
commit b83a4222b1
5 changed files with 284 additions and 0 deletions

View File

@ -121,6 +121,7 @@ struct LinkEditData {
MachOYAML::ExportEntry ExportTrie;
std::vector<NListEntry> NameList;
std::vector<StringRef> StringTable;
std::vector<yaml::Hex32> IndirectSymbols;
bool isEmpty() const;
};

View File

@ -54,6 +54,7 @@ private:
void writeNameList(raw_ostream &OS);
void writeStringTable(raw_ostream &OS);
void writeExportTrie(raw_ostream &OS);
void writeDynamicSymbolTable(raw_ostream &OS);
void dumpExportEntry(raw_ostream &OS, MachOYAML::ExportEntry &Entry);
void ZeroToOffset(raw_ostream &OS, size_t offset);
@ -482,6 +483,7 @@ void MachOWriter::writeLinkEditData(raw_ostream &OS) {
MachO::dyld_info_command *DyldInfoOnlyCmd = 0;
MachO::symtab_command *SymtabCmd = 0;
MachO::dysymtab_command *DSymtabCmd = 0;
for (auto &LC : Obj.LoadCommands) {
switch (LC.Data.load_command_data.cmd) {
case MachO::LC_SYMTAB:
@ -504,6 +506,11 @@ void MachOWriter::writeLinkEditData(raw_ostream &OS) {
WriteQueue.push_back(std::make_pair(DyldInfoOnlyCmd->export_off,
&MachOWriter::writeExportTrie));
break;
case MachO::LC_DYSYMTAB:
DSymtabCmd = &LC.Data.dysymtab_command_data;
WriteQueue.push_back(std::make_pair(
DSymtabCmd->indirectsymoff, &MachOWriter::writeDynamicSymbolTable));
break;
}
}
@ -556,6 +563,12 @@ void MachOWriter::writeStringTable(raw_ostream &OS) {
}
}
void MachOWriter::writeDynamicSymbolTable(raw_ostream &OS) {
for (auto Data : Obj.LinkEdit.IndirectSymbols)
OS.write(reinterpret_cast<const char *>(&Data),
sizeof(yaml::Hex32::BaseType));
}
class UniversalWriter {
public:
UniversalWriter(yaml::YamlObjectFile &ObjectFile)

View File

@ -164,6 +164,7 @@ void MappingTraits<MachOYAML::LinkEditData>::mapping(
IO.mapOptional("ExportTrie", LinkEditData.ExportTrie);
IO.mapOptional("NameList", LinkEditData.NameList);
IO.mapOptional("StringTable", LinkEditData.StringTable);
IO.mapOptional("IndirectSymbols", LinkEditData.IndirectSymbols);
}
void MappingTraits<MachOYAML::RebaseOpcode>::mapping(

View File

@ -0,0 +1,259 @@
# RUN: yaml2obj %s | obj2yaml | FileCheck %s
--- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x1000007
cpusubtype: 0x3
filetype: 0x2
ncmds: 16
sizeofcmds: 1368
flags: 0x200085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __PAGEZERO
vmaddr: 0
vmsize: 4294967296
fileoff: 0
filesize: 0
maxprot: 0
initprot: 0
nsects: 0
flags: 0
- cmd: LC_SEGMENT_64
cmdsize: 472
segname: __TEXT
vmaddr: 4294967296
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 5
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x100003F60
size: 37
offset: 0x3F60
align: 4
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 554889E54883EC10C745FC00000000488D3D30000000B000E80900000031C04883C4105DC3
- sectname: __stubs
segname: __TEXT
addr: 0x100003F86
size: 6
offset: 0x3F86
align: 1
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x6
reserved3: 0x0
content: FF2574400000
- sectname: __stub_helper
segname: __TEXT
addr: 0x100003F8C
size: 26
offset: 0x3F8C
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 4C8D1D754000004153FF2565000000906800000000E9E6FFFFFF
- sectname: __cstring
segname: __TEXT
addr: 0x100003FA6
size: 13
offset: 0x3FA6
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 68656C6C6F20776F726C640A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x100003FB4
size: 72
offset: 0x3FB4
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000603F00003400000034000000863F00000000000034000000030000000C000100100001000000000000000001
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 4294983680
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x100004000
size: 8
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: '0000000000000000'
- cmd: LC_SEGMENT_64
cmdsize: 232
segname: __DATA
vmaddr: 4295000064
vmsize: 16384
fileoff: 32768
filesize: 16384
maxprot: 3
initprot: 3
nsects: 2
flags: 0
Sections:
- sectname: __la_symbol_ptr
segname: __DATA
addr: 0x100008000
size: 8
offset: 0x8000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x7
reserved1: 0x2
reserved2: 0x0
reserved3: 0x0
content: 9C3F000001000000
- sectname: __data
segname: __DATA
addr: 0x100008008
size: 8
offset: 0x8008
align: 3
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: '0000000000000000'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 4295016448
vmsize: 16384
fileoff: 49152
filesize: 272
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_DYLD_INFO_ONLY
cmdsize: 48
rebase_off: 49152
rebase_size: 8
bind_off: 49160
bind_size: 24
weak_bind_off: 0
weak_bind_size: 0
lazy_bind_off: 49184
lazy_bind_size: 16
export_off: 49200
export_size: 48
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 49256
nsyms: 5
stroff: 49352
strsize: 72
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 1
iextdefsym: 1
nextdefsym: 2
iundefsym: 3
nundefsym: 2
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 49336
nindirectsyms: 3
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_LOAD_DYLINKER
cmdsize: 32
name: 12
Content: '/usr/lib/dyld'
ZeroPadBytes: 7
- cmd: LC_UUID
cmdsize: 24
uuid: FF5FAB50-C79A-3B66-AD3A-DE2F26398050
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 720896
sdk: 721664
ntools: 1
Tools:
- tool: 3
version: 46596096
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_MAIN
cmdsize: 24
entryoff: 16224
stacksize: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 84698117
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 49248
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 49256
datasize: 0
LinkEditData:
IndirectSymbols: [ 0x3, 0x4, 0x3 ]
...
#CHECK: IndirectSymbols: [ 0x3, 0x4, 0x3 ]

View File

@ -38,6 +38,7 @@ class MachODumper {
ArrayRef<uint8_t> OpcodeBuffer, bool Lazy = false);
void dumpExportTrie(std::unique_ptr<MachOYAML::Object> &Y);
void dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y);
void dumpIndirectSymbols(std::unique_ptr<MachOYAML::Object> &Y);
template <typename SectionType>
Expected<MachOYAML::Section> constructSectionCommon(SectionType Sec,
@ -351,6 +352,7 @@ void MachODumper::dumpLinkEdit(std::unique_ptr<MachOYAML::Object> &Y) {
true);
dumpExportTrie(Y);
dumpSymbols(Y);
dumpIndirectSymbols(Y);
}
void MachODumper::dumpRebaseOpcodes(std::unique_ptr<MachOYAML::Object> &Y) {
@ -599,6 +601,14 @@ void MachODumper::dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y) {
}
}
void MachODumper::dumpIndirectSymbols(std::unique_ptr<MachOYAML::Object> &Y) {
MachOYAML::LinkEditData &LEData = Y->LinkEdit;
MachO::dysymtab_command DLC = Obj.getDysymtabLoadCommand();
for (unsigned i = 0; i < DLC.nindirectsyms; ++i)
LEData.IndirectSymbols.push_back(Obj.getIndirectSymbolTableEntry(DLC, i));
}
Error macho2yaml(raw_ostream &Out, const object::MachOObjectFile &Obj,
unsigned RawSegments) {
std::unique_ptr<DWARFContext> DCtx = DWARFContext::create(Obj);