[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