[PATCH] D120645: [Object] Skip section offset checking for /<XFGHASHMAP>/

Pavel Samolysov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 1 05:37:31 PST 2022


psamolysov-intel updated this revision to Diff 412066.
psamolysov-intel added a comment.

@jhenderson Thank you, I missed the suggestion about the byte literal, sorry. Updated the test.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D120645/new/

https://reviews.llvm.org/D120645

Files:
  llvm/lib/Object/Archive.cpp
  llvm/test/tools/llvm-lib/xfghashmap-list.test


Index: llvm/test/tools/llvm-lib/xfghashmap-list.test
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-lib/xfghashmap-list.test
@@ -0,0 +1,33 @@
+# RUN: rm -rf %t && mkdir -p %t && cd %t
+# RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o a.obj %S/Inputs/a.s
+# RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o b.obj %S/Inputs/b.s
+# RUN: llvm-lib /out:xfghashmap.lib a.obj b.obj
+
+## Replace a section in the library file with /<XFGHASHMAP>/ emulating
+## a library from the Windows SDK for Windows 11.
+# RUN: %python %s xfghashmap.lib b.obj/
+
+## This should print the /<XFGHASHMAP>/ section as well as an .obj one.
+# RUN: llvm-lib /list %t/xfghashmap.lib | FileCheck %s
+
+# CHECK: a.obj
+# CHECK: /<XFGHASHMAP>/
+# CHECK-NOT: b.obj
+
+import sys
+
+if len(sys.argv) < 3:
+  print("Use: python3 xfghashmap-list.test <LIBRARY_FILE> <TEMPLATE>")
+  exit(1)
+
+template = bytes(sys.argv[2], 'utf-8')
+xfghashmap = b'/<XFGHASHMAP>/'
+
+data = None
+with open(sys.argv[1], "rb") as inp:
+  data = inp.read()
+with open(sys.argv[1], "wb") as outp:
+  pos = data.find(template)
+  outp.write(data[:pos])
+  outp.write(xfghashmap)
+  outp.write(data[pos + len(xfghashmap):])
Index: llvm/lib/Object/Archive.cpp
===================================================================
--- llvm/lib/Object/Archive.cpp
+++ llvm/lib/Object/Archive.cpp
@@ -256,6 +256,10 @@
       return Name;
     if (Name.size() == 2 && Name[1] == '/') // String table.
       return Name;
+    // System libraries from the Windows SDK for Windows 11 contain this symbol.
+    // It looks like a CFG guard: we just skip it for now.
+    if (Name.equals("/<XFGHASHMAP>/"))
+      return Name;
     // It's a long name.
     // Get the string table offset.
     std::size_t StringOffset;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120645.412066.patch
Type: text/x-patch
Size: 1841 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220301/b0bd620b/attachment.bin>


More information about the llvm-commits mailing list