[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