diff --git a/llvm/test/tools/obj2yaml/MachO/simple-exporttrie.yaml b/llvm/test/tools/obj2yaml/MachO/simple-exporttrie.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/obj2yaml/MachO/simple-exporttrie.yaml @@ -0,0 +1,203 @@ +# Test that obj2yaml + yaml2obj can round-trip mach-o library simple export trie entries. +# +# RUN: rm -rf %t && mkdir -p %t +# RUN: yaml2obj %s -o %t/libfoo.dylib | FileCheck %s --allow-empty --implicit-check-not warning: --implicit-check-not error: +# RUN: llvm-nm --dyldinfo-only %t/libfoo.dylib | FileCheck %s --check-prefix=NM +# NM: 3fb0 T _foo + +# RUN: obj2yaml %t/libfoo.dylib | FileCheck %s --check-prefix=YAML +# YAML: LinkEditData: +# YAML-NEXT: ExportTrie: +# YAML: Children: +#YAML-NEXT: - TerminalSize: 3 +#YAML-NEXT: NodeOffset: 8 +#YAML-NEXT: Name: _foo +#YAML-NEXT: Flags: 0x0 +#YAML-NEXT: Address: 0x3FB0 +#YAML-NEXT: Other: 0x0 +#YAML-NEXT: ImportName: '' + + + + +# This file was produced using: +# int foo() {return 1;} > tmp.c +# xcrun clang -Wl,-ld64 -isysroot `xcrun --show-sdk-path -sdk macosx` --target=arm64-apple-macos11.3 -dynamiclib -o libfoo.dylib -install_name @rpath/libfoo.dylib tmp.c + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x100000C + cpusubtype: 0x0 + filetype: 0x6 + ncmds: 13 + sizeofcmds: 680 + flags: 0x100085 + reserved: 0x0 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 232 + segname: __TEXT + vmaddr: 0 + vmsize: 16384 + fileoff: 0 + filesize: 16384 + maxprot: 5 + initprot: 5 + nsects: 2 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x3FB0 + size: 8 + offset: 0x3FB0 + align: 2 + reloff: 0x0 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 20008052C0035FD6 + - sectname: __unwind_info + segname: __TEXT + addr: 0x3FB8 + size: 72 + offset: 0x3FB8 + align: 2 + reloff: 0x0 + nreloc: 0 + flags: 0x0 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 010000001C000000000000001C000000000000001C00000002000000B03F00003400000034000000B93F00000000000034000000030000000C000100100001000000000000000002 + - cmd: LC_SEGMENT_64 + cmdsize: 72 + segname: __LINKEDIT + vmaddr: 16384 + vmsize: 16384 + fileoff: 16384 + filesize: 361 + maxprot: 1 + initprot: 1 + nsects: 0 + flags: 0 + - cmd: LC_ID_DYLIB + cmdsize: 48 + dylib: + name: 24 + timestamp: 1 + current_version: 0 + compatibility_version: 0 + Content: '@rpath/libfoo.dylib' + ZeroPadBytes: 5 + - cmd: LC_DYLD_INFO_ONLY + cmdsize: 48 + rebase_off: 0 + rebase_size: 0 + bind_off: 0 + bind_size: 0 + weak_bind_off: 0 + weak_bind_size: 0 + lazy_bind_off: 0 + lazy_bind_size: 0 + export_off: 16384 + export_size: 16 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 16408 + nsyms: 2 + stroff: 16440 + strsize: 24 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 0 + iextdefsym: 0 + nextdefsym: 1 + iundefsym: 1 + nundefsym: 1 + tocoff: 0 + ntoc: 0 + modtaboff: 0 + nmodtab: 0 + extrefsymoff: 0 + nextrefsyms: 0 + indirectsymoff: 0 + nindirectsyms: 0 + extreloff: 0 + nextrel: 0 + locreloff: 0 + nlocrel: 0 + - cmd: LC_UUID + cmdsize: 24 + uuid: A2CF51D8-828B-3E0F-B8FA-0DF9C5D1C91A + - cmd: LC_BUILD_VERSION + cmdsize: 32 + platform: 1 + minos: 721664 + sdk: 917504 + ntools: 1 + Tools: + - tool: 3 + version: 59441152 + - cmd: LC_SOURCE_VERSION + cmdsize: 16 + version: 0 + - cmd: LC_LOAD_DYLIB + cmdsize: 56 + dylib: + name: 24 + timestamp: 2 + current_version: 87556096 + compatibility_version: 65536 + Content: '/usr/lib/libSystem.B.dylib' + ZeroPadBytes: 6 + - cmd: LC_FUNCTION_STARTS + cmdsize: 16 + dataoff: 16400 + datasize: 8 + - cmd: LC_DATA_IN_CODE + cmdsize: 16 + dataoff: 16408 + datasize: 0 + - cmd: LC_CODE_SIGNATURE + cmdsize: 16 + dataoff: 16464 + datasize: 281 +LinkEditData: + ExportTrie: + TerminalSize: 0 + NodeOffset: 0 + Name: '' + Flags: 0x0 + Address: 0x0 + Other: 0x0 + ImportName: '' + Children: + - TerminalSize: 3 + NodeOffset: 8 + Name: _foo + Flags: 0x0 + Address: 0x3FB0 + Other: 0x0 + ImportName: '' + NameList: + - n_strx: 2 + n_type: 0xF + n_sect: 1 + n_desc: 0 + n_value: 16304 + - n_strx: 7 + n_type: 0x1 + n_sect: 0 + n_desc: 256 + n_value: 0 + StringTable: + - ' ' + - _foo + - dyld_stub_binder + FunctionStarts: [ 0x3FB0 ] +... diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp --- a/llvm/tools/obj2yaml/macho2yaml.cpp +++ b/llvm/tools/obj2yaml/macho2yaml.cpp @@ -533,7 +533,7 @@ * terminal. */ -const uint8_t *processExportNode(const uint8_t *CurrPtr, +const uint8_t *processExportNode(const uint8_t *Start, const uint8_t *CurrPtr, const uint8_t *const End, MachOYAML::ExportEntry &Entry) { if (CurrPtr >= End) @@ -572,7 +572,7 @@ CurrPtr += Count; } for (auto &Child : Entry.Children) { - CurrPtr = processExportNode(CurrPtr, End, Child); + CurrPtr = processExportNode(Start, Start + Child.NodeOffset, End, Child); } return CurrPtr; } @@ -583,7 +583,8 @@ auto ExportsTrie = Obj.getDyldInfoExportsTrie(); if (ExportsTrie.empty()) ExportsTrie = Obj.getDyldExportsTrie(); - processExportNode(ExportsTrie.begin(), ExportsTrie.end(), LEData.ExportTrie); + processExportNode(ExportsTrie.begin(), ExportsTrie.begin(), ExportsTrie.end(), + LEData.ExportTrie); } template