2012-10-06 64 views
0

我從來沒有在我的舊的Linux機器上安裝這個錯誤(都是英特爾32位),所以我不知所措。ld:未定義引用'eax'

我想組裝和鏈接彙編代碼(這是非常簡單的,並應工作),但ld是給錯誤

rs.o: In function `_start': 
(.text+0x11): undefined reference to `eax' 

有問題的行是pushl %eax線。我只需要將一個0的單個字節推入堆棧,所以我決定使用寄存器xor'd eax。但pushb給了我一個「無效後綴或操作數推」錯誤而使用的代碼pushb %alas組裝,如果我嘗試使用pushl %eaxas組裝正常,但連接對我大喊大叫。

這裏是代碼。

.section .data 

.section .text 

.global _start 

_start: 

xorl %eax, %eax 

#sys_socketcall(int call, __user *args) 
#sys_socket(int domain, int type, int protocol) 

pushl %eax   #protocol: 0 
pushl $1   #type: SOCK_STREAM 
pushl $2   #domain: AF_INET 
movL $1, %ebx  #sys_socket 
movl $102, %eax #sys_socketcall 
int $0x80 

movl $eax, %ebx #move socket fd to check echo $? 
movl $1, %eax #exit 
int $0x80 

任何幫助表示讚賞。

+0

''pushl%eax'在'_start + 0x11'處沒有辦法。 'movl $ eax,%ebx',另一方面...。 – DCoder

回答

5

您的組裝誤差:$eax應該%eax

movl $eax, %ebx #move socket fd to check echo $? 
+0

謝謝你在我的最後一個愚蠢的錯誤。將在6分鐘內接受你的答案。它修復了我的鏈接器問題。還有一個問題。爲什麼'push%al'和'pushb%al'返回錯誤:後綴或操作數對於推送無效。 –

+0

@bobmoch您不能在x86 x86中裝入8位寄存器。您必須改用'push%ax' /'pushw%ax','push%eax' /'pushd%eax'或'push%rax' /'pushq%rax'。 – nrz

+0

我明白了。謝謝(你的)信息。我也讀過perilbrain的鏈接,現在它變得更有意義。感謝所有幫助傢伙。 –

3

我能想象這是

movl $eax, %ebx #move socket fd to check echo $? 

線。

相反,它應該是

movl %eax, %ebx #move socket fd to check echo $? 

...

3
movl $eax, %ebx 

是有問題的。它會嘗試將名爲eax的符號的地址加載到ebx,,這不是您想要的。將該錯字更改爲

movl %eax, %ebx 

告訴它做你真正想要的。