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

Shankar Easwaran shankare at codeaurora.org
Mon Oct 28 21:16:29 PDT 2013


Hi Rui,

This is an incorrect subclass of SimpleFile. The MemberFile wouldnot 
return an empty vector of absoluteAtoms when absolute() is called.

I think the right way of doing this is to create a SimpleFile and add an 
AbsoluteAtom to it.

Thanks

Shankar Easwaran


On 10/28/2013 7:33 PM, Rui Ueyama wrote:
> 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
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-commits mailing list