diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp index e5353102effe..0c4e99acdd73 100644 --- a/lld/COFF/Chunks.cpp +++ b/lld/COFF/Chunks.cpp @@ -266,8 +266,16 @@ void LocalImportChunk::getBaserels(std::vector *Res, Res->push_back(getRVA() + Config->ImageBase); } +size_t LocalImportChunk::getSize() const { + return Config->is64() ? 8 : 4; +} + void LocalImportChunk::writeTo(uint8_t *Buf) { - write64le(Buf + FileOff, Sym->getRVA() + Config->ImageBase); + if (Config->is64()) { + write64le(Buf + FileOff, Sym->getRVA() + Config->ImageBase); + } else { + write32le(Buf + FileOff, Sym->getRVA() + Config->ImageBase); + } } // Windows-specific. diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h index 67c2c4c4555a..b9b533f6826e 100644 --- a/lld/COFF/Chunks.h +++ b/lld/COFF/Chunks.h @@ -245,7 +245,7 @@ private: class LocalImportChunk : public Chunk { public: explicit LocalImportChunk(Defined *S) : Sym(S) {} - size_t getSize() const override { return 8; } + size_t getSize() const override; void getBaserels(std::vector *Res, Defined *ImageBase) override; void writeTo(uint8_t *Buf) override; diff --git a/lld/test/COFF/locally-imported32.test b/lld/test/COFF/locally-imported32.test new file mode 100644 index 000000000000..8510a7c009d2 --- /dev/null +++ b/lld/test/COFF/locally-imported32.test @@ -0,0 +1,50 @@ +# RUN: yaml2obj < %s > %t.obj +# RUN: lld -flavor link2 /out:%t.exe /entry:main %t.obj +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 1000 00200000 + +# CHECK: Contents of section .rdata: +# CHECK-NEXT: 2000 04100040 + +--- +header: + Machine: IMAGE_FILE_MACHINE_I386 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: 00000000 + Relocations: + - VirtualAddress: 0 + SymbolName: __imp__main + Type: IMAGE_REL_I386_DIR32NB +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 4 + NumberOfRelocations: 1 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + Selection: IMAGE_COMDAT_SELECT_ANY + - Name: _main + Value: 4 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: __imp__main + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +...