NASM - The Netwide Assembler
NASM Forum => Programming with NASM => Topic started by: nasmman123 on October 14, 2013, 12:55:03 AM
-
I am writing a compiler that outputs for NASM. I have the compiler working for 32-bit windows and linux, I have 64-bit linux working and I am trying to get 64-bit windows working.
I have an issue with linking, it's a warning but I want to fix it and not ignore it. For some reason, even though I have default rel in both files (also tried default abs), the label is incorrectly refered to as a 32-bit address (waning below)
java.lang.Object.obj : error LNK2017: 'ADDR32' relocation to 'int__array@SIT' invalid without /LARGEADDRESSAWARE:NO
file 1
default rel
bits 64
section .data
global int__array@SIT
int__array@SIT:
file 2:
default rel
bits 64
.text
...
extern int__array@SIT
mov qword [rax], int__array@SIT
...
In the nasm manual, it does not seem like this should be the case. (http://www.nasm.us/doc/nasmdo11.html) section 11.2
"mov rax,foo ; 64-bit immediate" why is int__array@SIT not 64 bit? I have tried adding qword in front but there was no change.
Any help would be greatly appreciated.
-
Interesting. FWIW, I assembled your files as "-f elf64", and ld linked 'em without a peep (had to add a "_start" label). I have no idea what that's about. Any 64-bit gurus in earshot?
Best,
Frank
-
Thank you for your quick response, I have not tried linking with ld, I am using link. It's a warning that I don't think ld gives because ld did not give it when I compiled x64 linux code and it should be the same for that. Link is much more sensitive to warnings and errors (which I think is good usually warnings are a good sign), for example if you exten something that does not exist, even if you don't use it, it won't link. I used the entry point as main in my compilation because that's more standard for windows. I would also bet that the program will work as expected if the address is between the range of -2GB to 2GB away (in my cases it should be, but I don't want that to be a limitation and I want to be more technically correct in my assembly).
Interesting. FWIW, I assembled your files as "-f elf64", and ld linked 'em without a peep (had to add a "_start" label). I have no idea what that's about. Any 64-bit gurus in earshot?
Best,
Frank
-
extern int__array@SIT
mov qword [rax], int__array@SIT
If I recall correctly in x64 you cannot move an immediate 64-bit value directly to memory.
What does changing the above to the following give you:
mov rdx, int__array@SIT
mov qword [rax], rdx