[llvm] 15cfb44 - [macho2yaml] Fixup offset for nodes in export trie.
Cyndy Ishida via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 9 09:20:09 PDT 2023
Author: Cyndy Ishida
Date: 2023-08-09T09:18:18-07:00
New Revision: 15cfb4494d81a23aca8b7d5e2ac8721fa69b122d
URL: https://github.com/llvm/llvm-project/commit/15cfb4494d81a23aca8b7d5e2ac8721fa69b122d
DIFF: https://github.com/llvm/llvm-project/commit/15cfb4494d81a23aca8b7d5e2ac8721fa69b122d.diff
LOG: [macho2yaml] Fixup offset for nodes in export trie.
The offset recorded in export trie nodes is used to capture symbol
information like address and node size. This offset should be relative to the
root of the trie. This updates to `processExportNode` to follow that
expectation.
Reviewed By: pete, steven_wu
Differential Revision: https://reviews.llvm.org/D157431
Added:
llvm/test/tools/obj2yaml/MachO/simple-exporttrie.yaml
Modified:
llvm/tools/obj2yaml/macho2yaml.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/obj2yaml/MachO/simple-exporttrie.yaml b/llvm/test/tools/obj2yaml/MachO/simple-exporttrie.yaml
new file mode 100644
index 00000000000000..9641ac66dea212
--- /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
index c96b6cc3acce82..ed678ea28a7173 100644
--- a/llvm/tools/obj2yaml/macho2yaml.cpp
+++ b/llvm/tools/obj2yaml/macho2yaml.cpp
@@ -533,7 +533,7 @@ void MachODumper::dumpBindOpcodes(
* 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 @@ const uint8_t *processExportNode(const uint8_t *CurrPtr,
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 @@ void MachODumper::dumpExportTrie(std::unique_ptr<MachOYAML::Object> &Y) {
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 <typename nlist_t>
More information about the llvm-commits
mailing list