-
Notifications
You must be signed in to change notification settings - Fork 15.2k
release/21.x: [LLD] [COFF] Fix symbol names for import thunks (#160694) #160770
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@aganea What do you think about merging this PR to the release branch? |
|
@llvm/pr-subscribers-platform-windows @llvm/pr-subscribers-lld-coff Author: None (llvmbot) ChangesBackport 0d6af2d Requested by: @mstorsjo Full diff: https://github.com/llvm/llvm-project/pull/160770.diff 2 Files Affected:
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 076561807af47..ef9d051bf976e 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -1553,7 +1553,7 @@ void Writer::createSymbolAndStringTable() {
dthunk->wrappedSym->writtenToSymtab = true;
if (std::optional<coff_symbol16> sym =
createSymbol(dthunk->wrappedSym)) {
- if (d->getName().size() > COFF::NameSize)
+ if (dthunk->wrappedSym->getName().size() > COFF::NameSize)
longNameSymbols.emplace_back(outputSymtab.size(),
dthunk->wrappedSym->getName());
outputSymtab.push_back(*sym);
diff --git a/lld/test/COFF/strtab.s b/lld/test/COFF/strtab.s
index fbdd8df52d540..9edc13e19e825 100644
--- a/lld/test/COFF/strtab.s
+++ b/lld/test/COFF/strtab.s
@@ -1,17 +1,32 @@
# REQUIRES: x86
# RUN: llvm-mc -triple=x86_64-windows-msvc %s -filetype=obj -o %t.obj
-# RUN: lld-link -out:%t.exe -entry:main %t.obj -debug:dwarf
+# RUN: lld-link -machine:x64 -def:%S/Inputs/library.def -implib:%t.lib
+# RUN: lld-link -out:%t.exe -entry:main %t.obj %t.lib -debug:dwarf
# RUN: llvm-readobj --string-table %t.exe | FileCheck %s
+# RUN: llvm-nm %t.exe | FileCheck %s --check-prefix=SYMBOLS
+
+# Note, for this test to have the intended test coverage, the imported symbol
+# "function" needs to be such that the symbol name itself is <= 8 chars, while
+# "__imp_"+name is >8 chars.
# CHECK: StringTable {
-# CHECK-NEXT: Length: 87
+# CHECK-NEXT: Length: 102
# CHECK-NEXT: [ 4] .debug_abbrev
# CHECK-NEXT: [ 12] .debug_line
# CHECK-NEXT: [ 1e] long_name_symbolz
# CHECK-NEXT: [ 30] .debug_abbrez
-# CHECK-NEXT: [ 3e] __impl_long_name_symbolA
+# CHECK-NEXT: [ 3e] __imp_function
+# CHECK-NEXT: [ 4d] __impl_long_name_symbolA
# CHECK-NEXT: }
+# SYMBOLS: 140001000 N .debug_abbrez
+# SYMBOLS-NEXT: 140002070 R __imp_function
+# SYMBOLS-NEXT: 140001000 t __impl_long_name_symbolA
+# SYMBOLS-NEXT: 140001010 T function
+# SYMBOLS-NEXT: 140001000 t long_name_symbolA
+# SYMBOLS-NEXT: 140001000 t long_name_symbolz
+# SYMBOLS-NEXT: 140001000 T main
+# SYMBOLS-NEXT: 140001000 t name_symbolA
.global main
.text
@@ -21,6 +36,7 @@ long_name_symbolA:
__impl_long_name_symbolA:
name_symbolA:
.debug_abbrez:
+ call function
ret
.section .debug_abbrev,"dr"
|
|
@llvm/pr-subscribers-lld Author: None (llvmbot) ChangesBackport 0d6af2d Requested by: @mstorsjo Full diff: https://github.com/llvm/llvm-project/pull/160770.diff 2 Files Affected:
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 076561807af47..ef9d051bf976e 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -1553,7 +1553,7 @@ void Writer::createSymbolAndStringTable() {
dthunk->wrappedSym->writtenToSymtab = true;
if (std::optional<coff_symbol16> sym =
createSymbol(dthunk->wrappedSym)) {
- if (d->getName().size() > COFF::NameSize)
+ if (dthunk->wrappedSym->getName().size() > COFF::NameSize)
longNameSymbols.emplace_back(outputSymtab.size(),
dthunk->wrappedSym->getName());
outputSymtab.push_back(*sym);
diff --git a/lld/test/COFF/strtab.s b/lld/test/COFF/strtab.s
index fbdd8df52d540..9edc13e19e825 100644
--- a/lld/test/COFF/strtab.s
+++ b/lld/test/COFF/strtab.s
@@ -1,17 +1,32 @@
# REQUIRES: x86
# RUN: llvm-mc -triple=x86_64-windows-msvc %s -filetype=obj -o %t.obj
-# RUN: lld-link -out:%t.exe -entry:main %t.obj -debug:dwarf
+# RUN: lld-link -machine:x64 -def:%S/Inputs/library.def -implib:%t.lib
+# RUN: lld-link -out:%t.exe -entry:main %t.obj %t.lib -debug:dwarf
# RUN: llvm-readobj --string-table %t.exe | FileCheck %s
+# RUN: llvm-nm %t.exe | FileCheck %s --check-prefix=SYMBOLS
+
+# Note, for this test to have the intended test coverage, the imported symbol
+# "function" needs to be such that the symbol name itself is <= 8 chars, while
+# "__imp_"+name is >8 chars.
# CHECK: StringTable {
-# CHECK-NEXT: Length: 87
+# CHECK-NEXT: Length: 102
# CHECK-NEXT: [ 4] .debug_abbrev
# CHECK-NEXT: [ 12] .debug_line
# CHECK-NEXT: [ 1e] long_name_symbolz
# CHECK-NEXT: [ 30] .debug_abbrez
-# CHECK-NEXT: [ 3e] __impl_long_name_symbolA
+# CHECK-NEXT: [ 3e] __imp_function
+# CHECK-NEXT: [ 4d] __impl_long_name_symbolA
# CHECK-NEXT: }
+# SYMBOLS: 140001000 N .debug_abbrez
+# SYMBOLS-NEXT: 140002070 R __imp_function
+# SYMBOLS-NEXT: 140001000 t __impl_long_name_symbolA
+# SYMBOLS-NEXT: 140001010 T function
+# SYMBOLS-NEXT: 140001000 t long_name_symbolA
+# SYMBOLS-NEXT: 140001000 t long_name_symbolz
+# SYMBOLS-NEXT: 140001000 T main
+# SYMBOLS-NEXT: 140001000 t name_symbolA
.global main
.text
@@ -21,6 +36,7 @@ long_name_symbolA:
__impl_long_name_symbolA:
name_symbolA:
.debug_abbrez:
+ call function
ret
.section .debug_abbrev,"dr"
|
9cc9efc changed LLD to use a StringTableBuilder for optimizing the string table, used for long section and symbol names. That commit had a bug, where the symbol table entry for an import thunk with a long symbol name wouldn't get fetched from the StringTableBuilder, if the base symbol name (without the "__imp_" prefix) wasn't over 8 chars. This should fix issues with Go, which errors out on reading the executables with a broken symbol table, as noted in mstorsjo/llvm-mingw#518 and golang/go#75219. (cherry picked from commit 0d6af2d)
|
@mstorsjo (or anyone else). If you would like to add a note about this fix in the release notes (completely optional). Please reply to this comment with a one or two sentence description of the fix. When you are done, please add the release:note label to this PR. |
Backport 0d6af2d
Requested by: @mstorsjo