nasm,86_64,linux,“hello world”程序。当链接时,它说“重定位被截断以适应”

时间:2013-06-26 11:35:31

标签: linux assembly nasm

[section .data]
strHello db "Hello World"
STRLEN equ $-strHello
MessageLength equ 9
Message db "hi!!!!   "


[section .text]
global main
main:
mov edx,STRLEN;
mov ecx,strHello;
mov ebx,1
mov eax,4
int 0x80


call DispStr


mov ebx,0   
mov eax,1   
int 0x80    


DispStr:      
  mov ax,MessageLength
  mov dh,0
  mul dh
  add ax,Message
  mov bp,ax 
  mov ax,ds
  mov es,ax 
  mov cx,MessageLength
  mov ax,01301h 
  mov bx,0007h
  mov dl,0
  int 10h
  ret 

编译并运行:

$ nasm -f elf64 helloworld.asm -o helloworld.o
$ gcc -s -o helloworld helloworld.o
helloworld.o: In function `DispStr':
helloworld.asm:(.text+0x31): relocation truncated to fit: R_X86_64_16 against `.data'
collect2: ld return 1

2 个答案:

答案 0 :(得分:1)

这个确切的错误发生在:

add ax,Message

ax仅为16位宽,但Message是64位宽的地址,因此在重定位期间不适合。

我已在https://stackoverflow.com/a/32639540/895245

详细解释了此错误

在这种情况下,解决方案是使用如Using .org directive with data in .data section: In connection with ld

中提到的链接描述文件

此存储库包含引导扇区和BIOS的工作示例:https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0

答案 1 :(得分:0)

由于您处于64位模式,因此无法使用BIOS功能(即int 10h指令)。即使可以,BIOS也会使用不同的寻址机制,因此尝试使用Message的地址无论如何都无法正常工作。

此外,DispStr函数的前3行不会归零ax吗? (因为你乘以dh,只是设置为零)