[lld] r193565 - [PECOFF] Fix __ImageBase symbol.

Rui Ueyama ruiu at google.com
Mon Oct 28 17:33:35 PDT 2013


Author: ruiu
Date: Mon Oct 28 19:33:34 2013
New Revision: 193565

URL: http://llvm.org/viewvc/llvm-project?rev=193565&view=rev
Log:
[PECOFF] Fix __ImageBase symbol.

__ImageBase is an absolute symbol whose address is the same as the image base
address. What we did before this patch was to create __ImageBase symbol as a
symbol whose *contents* (not location) is the image base address, which is
clearly wrong.

Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
    lld/trunk/test/pecoff/imagebase.test

Modified: lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h?rev=193565&r1=193564&r2=193565&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h Mon Oct 28 19:33:34 2013
@@ -27,50 +27,26 @@ namespace coff {
 
 namespace {
 
-// The symbol __ImageBase is a linker generated symbol. No standard library
-// files define it, but the linker is expected to prepare it as if it was read
-// from a file. The content of the atom is a 4-byte integer equal to the image
-// base address. Note that because the name is prefixed by an underscore on x86
-// Win32, the actual symbol name will be ___ImageBase (three underscores).
-class ImageBaseAtom : public COFFLinkerInternalAtom {
-public:
-  ImageBaseAtom(const PECOFFLinkingContext &context, const File &file,
-                uint32_t imageBase)
-      : COFFLinkerInternalAtom(file, assembleRawContent(imageBase)),
-        _name(context.decorateSymbol("__ImageBase")) {}
-
-  virtual StringRef name() const { return _name; }
-  virtual uint64_t ordinal() const { return 0; }
-  virtual ContentType contentType() const { return typeData; }
-  virtual ContentPermissions permissions() const { return permRW_; }
-  virtual DeadStripKind deadStrip() const { return deadStripAlways; }
-
-private:
-  std::vector<uint8_t> assembleRawContent(uint32_t imageBase) {
-    std::vector<uint8_t> data = std::vector<uint8_t>(4);
-    *(reinterpret_cast<uint32_t *>(&data[0])) = imageBase;
-    return data;
-  }
-
-  StringRef _name;
-};
-
-// The file to wrap ImageBaseAtom. This is the only member file of
-// LinkerGeneratedSymbolFile.
+// A virtual file containing absolute symbol __ImageBase. __ImageBase (or
+// ___ImageBase on x86) is a linker-generated symbol whose address is the same
+// as the image base address.
+//
+// This is the only member file of LinkerGeneratedSymbolFile.
 class MemberFile : public SimpleFile {
 public:
-  MemberFile(const PECOFFLinkingContext &context)
-      : SimpleFile(context, "Member of the Linker Internal File"),
-        _atom(context, *this, context.getBaseAddress()) {
-    addAtom(_atom);
+  MemberFile(const PECOFFLinkingContext &ctx)
+      : SimpleFile(ctx, "Member of the Linker Internal File"),
+        _imageBaseAtom(*this, ctx.decorateSymbol("__ImageBase"),
+                       Atom::scopeGlobal, ctx.getBaseAddress()) {
+    addAtom(_imageBaseAtom);
   };
 
   bool contains(StringRef name) const {
-    return _atom.name() == name;
+    return _imageBaseAtom.name() == name;
   }
 
 private:
-  ImageBaseAtom _atom;
+  COFFAbsoluteAtom _imageBaseAtom;
 };
 
 } // anonymous namespace

Modified: lld/trunk/test/pecoff/imagebase.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/imagebase.test?rev=193565&r1=193564&r2=193565&view=diff
==============================================================================
--- lld/trunk/test/pecoff/imagebase.test (original)
+++ lld/trunk/test/pecoff/imagebase.test Mon Oct 28 19:33:34 2013
@@ -2,11 +2,12 @@
 #
 # RUN: lld -flavor link /out:%t1 /subsystem:console /entry:_start /opt:noref \
 # RUN:   -- %t.obj \
-# RUN:   && llvm-objdump -disassemble %t1 | FileCheck -check-prefix=CHECK1 %s
+# RUN:   && llvm-objdump -disassemble %t1 | FileCheck -check-prefix=DEFAULT %s
 #
 # RUN: lld -flavor link /out:%t1 /subsystem:console /entry:_start /base:65536 \
 # RUN:   /opt:noref -- %t.obj \
-# RUN:   && llvm-objdump -disassemble %t1 | FileCheck -check-prefix=CHECK2 %s
+# RUN:   && llvm-objdump -disassemble %t1 | FileCheck -check-prefix=BASE %s
 
-CHECK1: a1 00 20 40 00    movl    4202496, %eax
-CHECK2: a1 00 20 01 00    movl    73728, %eax
+DEFAULT: a1 00 00 40 00    movl    4194304, %eax
+
+BASE:    a1 00 00 01 00    movl    65536, %eax





More information about the llvm-commits mailing list