2012-11-01 172 views
9

我有用32位彙編語言編寫的程序......現在我只是無法在64位操作系統上編譯它。在我們學校他們是特定的,程序必須用32位版本編寫。這裏是我的程序:在64位ubuntu上編譯32位彙編程序

bits 32 
extern _printf 
global _start 

section .data 
    message db "Hello world!!", 10, 0 

section .text 

_start: 
    pushad 
    push dword message 
    call _printf 
    add esp, 4 
    popad 
    ret 

任何想法?我已經嘗試了很多方法來編譯它。編譯後 錯誤輸出:

nasm -f elf64 vaja4.asm 
ld vaja4.o -o vaja4 
./vaja4 

輸出:

vaja4.o: In function `_start': 
vaja4.asm:(.text+0x7): undefined reference to `_printf' 
+0

不應該是printf不是_printf? – iabdalkader

+0

同樣的錯誤:vaja4.o:在函數'start'中: vaja4.asm :(.text + 0x7):未定義的對'printf'的引用 – Klemenko

回答

15

首先改變_printfprintf_start符號main,然後用gcc連接到目標文件,這將自動鏈接到libc,你需要這樣做,因爲AFAIK你不能鏈接到libc沒有main。你也應該使用裝配時,因爲代碼中有32個指令ELF32不ELF64:

bits 32 
extern printf 
global main 

section .data 
    message db "Hello world!!", 10, 0 

section .text 

main: 
    pushad 
    push dword message 
    call printf 
    add esp, 4 
    popad 
    ret 

而且隨着建:

nasm -f elf32 vaja4.asm 
gcc -m32 vaja4.o -o vaja4 
$./test 
$Hello world!! 

有一個很好的教程在這裏:

http://jdefr.swippet.com/2012/03/22/using-libc-with-assembly/

編輯:

既然現在你編譯一個64位系統上的32位代碼,你將需要安裝庫

apt-get install ia32-libs 
+1

是的,這是正確的方法。如果你想使用libc,你應該使用'main'作爲入口點並使用gcc鏈接,以便適當的libc塊被拉入並且初始化/關閉被處理。此外,只需從'main'返回工作,如果創建一個沒有libc的二進制文件,則必須使用退出系統調用。 – Jester

+0

好吧,我試過你的方式。在gcc -m32 vaja4.o -o vaja4之後,它給了我錯誤輸出: http://pastebin.com/jX3N2GSJ – Klemenko

+0

你需要安裝32位庫apt-get install ia32-libs – iabdalkader

1

它看起來像你對我忘了的C庫鏈接,這是提供printf功能(和其他人)的一部分:

ld vaja4.o -o vaja4 -lc 
4

我懷疑你看到的錯誤是因爲32/64位的問題。你看即

vaja4.asm:(.text+0x7): undefined reference to `_printf' 

錯誤明顯是告訴你的符號_printf是不確定的,這意味着對於printf函數庫沒有被鏈接。

你的鏈接步驟即

ld vaja4.o -o vaja4 

不包括任何庫。您需要將程序與可以提供printf函數定義的庫鏈接。我相信ld應該選擇它自己的庫而不打擾你使用這些消息,但因爲它無法找到適合此函數的C庫,我想你沒有所需的庫,即32位或64庫缺失。

無論如何,PLZ試試下面的命令序列組裝和鏈接程序:

nasm -f elf vaja4.asm 
ld -m elf_i386 vaja4.o vaja4 
./vaja4 
+0

甚至是'ld -m elf_i386 -I/lib/ld-linux.so .2 -lc vaja4.o -o vaja4'可能不需要'-I'開關 - 在輸出文件名中絕對需要'-lc'和'-o'。 '_start'標籤被跳轉到,沒有被調用。所以你不能從中退出。更容易使用'main'和gcc ... –

+0

或'ld -m elf_i386 -s -o vaja4 vaja4.o'作爲連接階段。 –

7

的32位版本在Ubuntu 12。10,您需要安裝第一

sudo apt-get update 
sudo apt-get install libc6-dev-i386 

開發包

gcc -m32 vaja4.o -o vaja4 

工作。

+0

像魅力一樣工作。 –