From: Reid Kleckner Date: Fri, 31 Jul 2015 16:14:22 +0000 (+0000) Subject: [COFF] Return symbol VAs instead of RVAs for PE files X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c136e5507a3f3d0a35e83c9db99c6081735aa5a0;p=oota-llvm.git [COFF] Return symbol VAs instead of RVAs for PE files This makes llvm-nm consistent with binutils nm on executables and DLLs. For a vanilla hello world executable, the address of main should include the default image base of 0x400000. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243755 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 1ae8059a021..ed63f3a64e0 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 00000000000..d4a343088b1 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 00000000000..366767b9b77 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 00000000000..f95aeebf727 --- /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