Skip to content

Commit

Permalink
[ELF] -M/-Map: fix VMA/LMA/Size columns of symbol assignments when ad…
Browse files Browse the repository at this point in the history
…dress/size>=2**32

SymbolAssignment::addr stores the location counter. The type should be
uint64_t instead of unsigned. The upper half of the address space is
commonly used by operating system kernels.

Similarly, SymbolAssignment::size should be an uint64_t. A kernel linker
script can move the location counter from 0 to the upper half of the
address space.

Reviewed By: grimar

Differential Revision: https://reviews.llvm.org/D77445
  • Loading branch information
MaskRay committed Apr 7, 2020
1 parent 95eb50c commit 4e907e9
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lld/ELF/LinkerScript.h
Expand Up @@ -109,11 +109,11 @@ struct SymbolAssignment : BaseCommand {
std::string commandString;

// Address of this assignment command.
unsigned addr;
uint64_t addr;

// Size of this assignment command. This is usually 0, but if
// you move '.' this may be greater than 0.
unsigned size;
uint64_t size;
};

// Linker scripts allow additional constraints to be put on output sections.
Expand Down
19 changes: 19 additions & 0 deletions lld/test/ELF/map-file-64bit.s
@@ -0,0 +1,19 @@
# REQUIRES: x86
## Test how we display the upper half of the address space, which is commonly
## used by operating system kernels.

# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t.o
# RUN: ld.lld -M -T %s %t.o -o /dev/null | FileCheck %s --match-full-lines --strict-whitespace

## . = 0xffffffff80000000; has a misaligned Size column.
# CHECK: VMA LMA Size Align Out In Symbol
# CHECK-NEXT: 0 0 ffffffff80000000 1 . = 0xffffffff80000000
# CHECK-NEXT:ffffffff80000000 0 100000 1 . += 0x100000
# CHECK-NEXT:ffffffff80100000 0 0 1 _text = .
# CHECK-NEXT:ffffffff80100000 ffffffff80100000 0 4 .text

SECTIONS {
. = 0xffffffff80000000;
. += 0x100000;
_text = .;
}

0 comments on commit 4e907e9

Please sign in to comment.