diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 1ae8059a02166..ed63f3a64e099 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -171,6 +171,14 @@ ErrorOr COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const { if (std::error_code EC = getSection(SectionNumber, Section)) return EC; Result += Section->VirtualAddress; + + // The section VirtualAddress does not include ImageBase, and we want to + // return virtual addresses. + if (PE32Header) + Result += PE32Header->ImageBase; + else if (PE32PlusHeader) + Result += PE32Header->ImageBase; + return Result; } diff --git a/test/Object/Inputs/main-ret-zero-pe-i386.dll b/test/Object/Inputs/main-ret-zero-pe-i386.dll new file mode 100755 index 0000000000000..d4a343088b178 Binary files /dev/null and b/test/Object/Inputs/main-ret-zero-pe-i386.dll differ diff --git a/test/Object/Inputs/main-ret-zero-pe-i386.exe b/test/Object/Inputs/main-ret-zero-pe-i386.exe new file mode 100755 index 0000000000000..366767b9b773a Binary files /dev/null and b/test/Object/Inputs/main-ret-zero-pe-i386.exe differ diff --git a/test/Object/nm-pe-image.test b/test/Object/nm-pe-image.test new file mode 100644 index 0000000000000..f95aeebf7271d --- /dev/null +++ b/test/Object/nm-pe-image.test @@ -0,0 +1,31 @@ +The executable was generated like so: +$ cat t.c +int main() { return 0; } +$ clang --target=i686-windows -c t.c -o t.o +$ lld-link2 t.o -out:t.exe -entry:main -debug + +It has a mingw-style symbol table in the executable, which MSVC-produced images +don't have. + +RUN: llvm-nm %p/Inputs/main-ret-zero-pe-i386.exe \ +RUN: | FileCheck %s -check-prefix PE-EXE + +PE-EXE: 00401000 t .bss +PE-EXE: 00401000 t .data +PE-EXE: 00401000 t .text +PE-EXE: 00401000 T _main + +The DLL was generated like so: +$ cat t.c +int DllMain(void *mod, long reason, void *reserved) { return 1; } +$ clang --target=i686-windows -c t.c -o t.o +$ lld-link2 t.o -out:t.exe -entry:DllMain -debug -dll + + +RUN: llvm-nm %p/Inputs/main-ret-zero-pe-i386.dll \ +RUN: | FileCheck %s -check-prefix PE-DLL + +PE-DLL: 10001000 t .bss +PE-DLL: 10001000 t .data +PE-DLL: 10001000 t .text +PE-DLL: 10001000 T _DllMain