1
votes

For a binary instrumentation project I wrote a chunk of assembly code in NASM, which gets mapped into a binary's address space at runtime.

The chunk gets loaded at address instrument_addr, and needs to access data at address instrument_addr+data_offset, where data_offset is some fixed 31-bit number. Due to ASLR I don't know the value of instrument_addr at compile time.

Since I don't know the absolute address of my instrumentation code, but the relative offset of my data, I would like to use RIP-relative addressing:

; Example for data_offset = 0x1000
0:  48 8b 05 f9 0f 00 00    mov    rax, QWORD PTR [rip+0xff9]    # 1000

However, the most straightforward approach

; This is offset 0 of my assembly file
instrument:
    mov rax, qword [rel 0x1000]

only leads to:

$ nasm -f elf64 -o instrument.o instrument.asm
instrument.asm:3: warning: absolute address can not be RIP-relative [-w+other]

Using [absolute 0x1000] with a dummy label produces the same warning.

How can I force NASM to generate RIP-relative accesses to a certain fixed offset?

2

2 Answers

1
votes

The syntax you're looking for is [rel $+0x1000] for an offset from the current location, or [rel instrument+0x1000] for an offset from the label. In the example in your question, those happen to be the same since the mov is the first thing after the label, but if there were anything in between, they'd be different.

1
votes

Nasm interprets your code as "access address 0x1000 using rip-relative addressing" and so it fails. What you can do is specify a relative address using the $ symbol, which stands for the address of the current instruction:

mov rax, qword [rel $+0x1000]