[COFF] Align import address chunks to the pointer size
This fixes cases on ARM64 when importing from more than one DLL, in case the imports from the first DLL ended up unaligned. When fixing up a IMAGE_REL_ARM64_PAGEOFFSET_12L, which shifts the offset by the load/store size, check that the shift doesn't discard any bits. (This would also detect if the import address chunks were unaligned.) Differential revision: https://reviews.llvm.org/D35640 llvm-svn: 308585
This commit is contained in:
parent
1c8af27ae1
commit
b3c97b9623
|
@ -184,6 +184,8 @@ static void applyArm64Imm(uint8_t *Off, uint64_t Imm) {
|
|||
|
||||
static void applyArm64Ldr(uint8_t *Off, uint64_t Imm) {
|
||||
int Size = read32le(Off) >> 30;
|
||||
if ((Imm & ((1 << Size) - 1)) != 0)
|
||||
fatal("misaligned ldr/str offset");
|
||||
Imm >>= Size;
|
||||
applyArm64Imm(Off, Imm);
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ private:
|
|||
// A chunk for the import descriptor table.
|
||||
class LookupChunk : public Chunk {
|
||||
public:
|
||||
explicit LookupChunk(Chunk *C) : HintName(C) {}
|
||||
explicit LookupChunk(Chunk *C) : HintName(C) { Align = ptrSize(); }
|
||||
size_t getSize() const override { return ptrSize(); }
|
||||
|
||||
void writeTo(uint8_t *Buf) const override {
|
||||
|
@ -76,7 +76,7 @@ public:
|
|||
// See Microsoft PE/COFF spec 7.1. Import Header for details.
|
||||
class OrdinalOnlyChunk : public Chunk {
|
||||
public:
|
||||
explicit OrdinalOnlyChunk(uint16_t V) : Ordinal(V) {}
|
||||
explicit OrdinalOnlyChunk(uint16_t V) : Ordinal(V) { Align = ptrSize(); }
|
||||
size_t getSize() const override { return ptrSize(); }
|
||||
|
||||
void writeTo(uint8_t *Buf) const override {
|
||||
|
@ -262,7 +262,7 @@ public:
|
|||
// A chunk for the import descriptor table.
|
||||
class DelayAddressChunk : public Chunk {
|
||||
public:
|
||||
explicit DelayAddressChunk(Chunk *C) : Thunk(C) {}
|
||||
explicit DelayAddressChunk(Chunk *C) : Thunk(C) { Align = ptrSize(); }
|
||||
size_t getSize() const override { return ptrSize(); }
|
||||
|
||||
void writeTo(uint8_t *Buf) const override {
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
|||
LIBRARY library2
|
||||
EXPORTS
|
||||
function2
|
|
@ -0,0 +1,85 @@
|
|||
# REQUIRES: aarch64
|
||||
|
||||
# RUN: yaml2obj < %s > %t.obj
|
||||
# RUN: llvm-objdump -d %t.obj | FileCheck %s -check-prefix BEFORE
|
||||
# RUN: lld-link /entry:main /subsystem:console /out:%t.exe %t.obj %p/Inputs/library-arm64.lib %p/Inputs/library2-arm64.lib
|
||||
# RUN: llvm-objdump -d %t.exe | FileCheck %s -check-prefix AFTER
|
||||
# RUN: llvm-readobj -coff-imports %t.exe | FileCheck %s -check-prefix IMPORTS
|
||||
|
||||
# BEFORE: Disassembly of section .text:
|
||||
# BEFORE: 0: 00 00 00 94 bl #0
|
||||
# BEFORE: 4: 00 00 00 94 bl #0
|
||||
# BEFORE: 8: c0 03 5f d6 ret
|
||||
|
||||
# AFTER: Disassembly of section .text:
|
||||
# AFTER: 140001000: 03 00 00 94 bl #12
|
||||
# AFTER: 140001004: 05 00 00 94 bl #20
|
||||
# AFTER: 140001008: c0 03 5f d6 ret
|
||||
# AFTER: 14000100c: 10 00 00 b0 adrp x16, #4096
|
||||
# AFTER: 140001010: 10 32 40 f9 ldr x16, [x16, #96]
|
||||
# AFTER: 140001014: 00 02 1f d6 br x16
|
||||
# AFTER: 140001018: 10 00 00 b0 adrp x16, #4096
|
||||
# AFTER: 14000101c: 10 3a 40 f9 ldr x16, [x16, #112]
|
||||
# AFTER: 140001020: 00 02 1f d6 br x16
|
||||
|
||||
# IMPORTS: Import {
|
||||
# IMPORTS: Name: library.dll
|
||||
# IMPORTS: ImportLookupTableRVA: 0x2040
|
||||
# IMPORTS: ImportAddressTableRVA: 0x2060
|
||||
# IMPORTS: Symbol: function (2)
|
||||
# IMPORTS: }
|
||||
# IMPORTS: Import {
|
||||
# IMPORTS: Name: library2.dll
|
||||
# IMPORTS: ImportLookupTableRVA: 0x2050
|
||||
# IMPORTS: ImportAddressTableRVA: 0x2070
|
||||
# IMPORTS: Symbol: function2 (0)
|
||||
# IMPORTS: }
|
||||
|
||||
--- !COFF
|
||||
header:
|
||||
Machine: IMAGE_FILE_MACHINE_ARM64
|
||||
Characteristics: [ ]
|
||||
sections:
|
||||
- Name: .text
|
||||
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
|
||||
Alignment: 4
|
||||
SectionData: 0000009400000094C0035FD6
|
||||
Relocations:
|
||||
- VirtualAddress: 0
|
||||
SymbolName: function
|
||||
Type: 3
|
||||
- VirtualAddress: 4
|
||||
SymbolName: function2
|
||||
Type: 3
|
||||
symbols:
|
||||
- Name: .text
|
||||
Value: 0
|
||||
SectionNumber: 1
|
||||
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||
StorageClass: IMAGE_SYM_CLASS_STATIC
|
||||
SectionDefinition:
|
||||
Length: 12
|
||||
NumberOfRelocations: 2
|
||||
NumberOfLinenumbers: 0
|
||||
CheckSum: 1438860354
|
||||
Number: 1
|
||||
- Name: main
|
||||
Value: 0
|
||||
SectionNumber: 1
|
||||
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
||||
- Name: function
|
||||
Value: 0
|
||||
SectionNumber: 0
|
||||
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
||||
- Name: function2
|
||||
Value: 0
|
||||
SectionNumber: 0
|
||||
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
||||
...
|
Loading…
Reference in New Issue