aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2019-08-06 07:47:52 +0000
committerHans Wennborg <hans@hanshq.net>2019-08-06 07:47:52 +0000
commitd55911285f09faa29430ab5b0ebf0de54b328118 (patch)
tree0639ea0377b314182572a304d87e9fea66192d43
parented144118e418146543025991915be28540d31a40 (diff)
Merging r367836:
------------------------------------------------------------------------ r367836 | mstorsjo | 2019-08-05 13:57:00 +0200 (Mon, 05 Aug 2019) | 17 lines [COFF] Omit automatically imported symbols from the symbol table These symbols actually point to the symbol's IAT entry, which obviously is different from the symbol itself (which is imported from a different module and doesn't exist in the current one). Omitting this symbol helps gdb inspect automatically imported symbols, see https://sourceware.org/bugzilla/show_bug.cgi?id=24574 for discussion on the matter. Surprisingly, those extra symbols don't seem to be an issue for gdb when the sources have been built with clang, only with gcc. The actual logic in gdb that this depends on still is unknown, but omitting these symbols from the symbol table is the right thing to do in any case. Differential Revision: https://reviews.llvm.org/D65727 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/lld/branches/release_90@367986 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--COFF/Writer.cpp7
-rw-r--r--test/COFF/autoimport-gnu-implib.s7
-rw-r--r--test/COFF/autoimport-x86.s9
3 files changed, 20 insertions, 3 deletions
diff --git a/COFF/Writer.cpp b/COFF/Writer.cpp
index 3da8b98d3..cc75db0f5 100644
--- a/COFF/Writer.cpp
+++ b/COFF/Writer.cpp
@@ -1095,6 +1095,13 @@ Optional<coff_symbol16> Writer::createSymbol(Defined *def) {
}
}
+ // Symbols that are runtime pseudo relocations don't point to the actual
+ // symbol data itself (as they are imported), but points to the IAT entry
+ // instead. Avoid emitting them to the symbol table, as they can confuse
+ // debuggers.
+ if (def->isRuntimePseudoReloc)
+ return None;
+
StringRef name = def->getName();
if (name.size() > COFF::NameSize) {
sym.Name.Offset.Zeroes = 0;
diff --git a/test/COFF/autoimport-gnu-implib.s b/test/COFF/autoimport-gnu-implib.s
index e6e0ed207..d7d4ed626 100644
--- a/test/COFF/autoimport-gnu-implib.s
+++ b/test/COFF/autoimport-gnu-implib.s
@@ -7,9 +7,10 @@
# RUN: llvm-ar rcs %t-implib.a %t-dabcdh.o %t-dabcds00000.o %t-dabcdt.o
# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.obj
-# RUN: lld-link -lldmingw -out:%t.exe -entry:main %t.obj %t-implib.a -verbose
+# RUN: lld-link -lldmingw -debug:symtab -out:%t.exe -entry:main %t.obj %t-implib.a -verbose
# RUN: llvm-readobj --coff-imports %t.exe | FileCheck -check-prefix=IMPORTS %s
+# RUN: llvm-nm %t.exe | FileCheck -check-prefix=SYMBOLS %s
# IMPORTS: Import {
# IMPORTS-NEXT: Name: foo.dll
@@ -18,6 +19,10 @@
# IMPORTS-NEXT: Symbol: data (0)
# IMPORTS-NEXT: }
+# Check that the automatically imported symbol "data" is not listed in
+# the symbol table.
+# SYMBOLS-NOT: {{ }}data
+
.global main
.text
main:
diff --git a/test/COFF/autoimport-x86.s b/test/COFF/autoimport-x86.s
index 400cec711..9e0ae1ead 100644
--- a/test/COFF/autoimport-x86.s
+++ b/test/COFF/autoimport-x86.s
@@ -5,11 +5,12 @@
# RUN: lld-link -out:%t-lib.dll -dll -entry:DllMainCRTStartup %t-lib.obj -lldmingw -implib:%t-lib.lib
# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.obj
-# RUN: lld-link -lldmingw -out:%t.exe -entry:main %t.obj %t-lib.lib -verbose
+# RUN: lld-link -lldmingw -debug:symtab -out:%t.exe -entry:main %t.obj %t-lib.lib -verbose
# RUN: llvm-readobj --coff-imports %t.exe | FileCheck -check-prefix=IMPORTS %s
# RUN: llvm-objdump -d %t.exe | FileCheck -check-prefix=DISASM %s
# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=CONTENTS %s
+# RUN: llvm-nm %t.exe | FileCheck -check-prefix=SYMBOLS %s
# IMPORTS: Import {
# IMPORTS-NEXT: Name: autoimport-x86.s.tmp-lib.dll
@@ -20,7 +21,7 @@
# DISASM: Disassembly of section .text:
# DISASM-EMPTY:
-# DISASM: .text:
+# DISASM: main:
# Relative offset at 0x1002 pointing at the IAT at 0x2080.
# DISASM: 140001000: 8b 05 7a 10 00 00 movl 4218(%rip), %eax
# DISASM: 140001006: c3 retq
@@ -41,6 +42,10 @@
# CONTENTS: 140003000 80200040 01000000 00200040 01000000
# CONTENTS: 140003010 24200040 01000000
+# Check that the automatically imported symbol "variable" is not listed in
+# the symbol table.
+# SYMBOLS-NOT: variable
+
.global main
.text
main: