NASM - The Netwide Assembler
NASM Forum => Using NASM => Topic started by: zhiliang on March 30, 2015, 07:51:23 AM
-
When I use nasm2.11.08 to build RIP-relative addresses in MAC OSX 64bit , it will get error, but nasm2.11.06 will work well.
The code is as following
SECTION .rodata align=16
align 16
sse2_plane_inc_minus dw -7, -6, -5, -4, -3, -2, -1, 0
align 16
sse2_plane_inc dw 1, 2, 3, 4, 5, 6, 7, 8
;using of sse2_plane_inc_minus, sse2_plane_inc
movdqa xmm5, [sse2_plane_inc_minus]
movdqa xmm6, [sse2_plane_inc]
And I find There is one statement "Fix segmentation failure when rip addressing is used in macho64 backend" in the nasm release note of Version 2.11.08, is it related with this?
-
I'm not familiar with OSX. You say "RIP-relative", but you don't seem to ask Nasm to do so (default is "abs").
SECTION .rodata align=16
align 16
sse2_plane_inc_minus dw -7, -6, -5, -4, -3, -2, -1, 0
align 16
sse2_plane_inc dw 1, 2, 3, 4, 5, 6, 7, 8
;using of sse2_plane_inc_minus, sse2_plane_inc
movdqa xmm5, [rel sse2_plane_inc_minus]
movdqa xmm6, [rel sse2_plane_inc]
... seems to fix it. Or "default rel". I don't know why we need to do that in "-f macho64", but we do. Does that solve your problem?
Thanks for the feedback on this, zhiliang! I don't think we have too many OSX users, so we need to hear from you if there's a problem.
Best,
Frank
-
The code that zhiliang quoted wasn't the complete code, it does set "default rel" at the start of the file.
A full example that shows the issue is this:
default rel
bits 64
section .rodata
data dq 42
; comment out otherdata to make it work
otherdata dw 100
section .text
global _testFunc
_testFunc:
mov rax, [data]
ret
When run, this returns 0, not 42 as intended (when assesmbled with nasm 2.11.08). When assembled with an older version of nasm (such as 2.11.06) or with yasm, it works as intended.
The disassembly of this snippet, when assembled with 2.11.08, looks like this:
test.o:
(__TEXT,__text) section
_testFunc:
0000000000000000 movq 0xf8(%rip), %rax
0000000000000007 retq
With the earlier, working versions, it looks like this:
test.o:
(__TEXT,__text) section
_testFunc:
0000000000000000 movq (%rip), %rax
0000000000000007 retq
-
It seems like this is the same issue as was reported in http://bugzilla.nasm.us/show_bug.cgi?id=3392306.
-
Thanks for the update, mstorsjo. I agree that it looks like the same bug - which means(?) that it has come to the attention of the development team. I just dropped 'em a note to be sure.
This is my attempt to disassemble the two files with ndisasm (-b64 -e0x120):
this is with 2.11.06
00000000 488B0500000000 mov rax,[rel 0x7]
00000007 C3 ret
I guess it's "right"?
this is with 2.11.08
00000000 488B05F8000000 mov rax,[rel 0xff]
00000007 C3 ret
Apparently not right.
Since I don't imagine the fix will be immediate, I can only suggest using 2.11.06 until 2.11.09 comes along (and then close your eyes and wish really really hard...).
Again, thanks to both of you for your feedback!
Best,
Frank