2011-12-22 131 views
3

我有一個64位的Ubuntu操作系統,我一直在學習32位彙編。我試圖編譯這兩個文件:在Linux 64位上組合C和彙編(32位代碼)

square.s:

#square.s 

.section .text 
.globl sqr 
.type sqr, @function 
sqr: 
    pushl %ebp 
    movl %esp, %ebp 
    movl 8(%ebp), %eax 
    imull %eax, %eax 
    popl %ebp 
    ret 

的main.c:

//main.c 
#include <stdio.h> 
extern long sqr(long); 
int main(int argc, char* argv[]) 
{ 
    long squared = sqr(10); 
    printf("%lu\n", squared); 
    return 0; 
} 

在我的32位虛擬機我用這個命令

gcc main.c square.s -o test 
它們編

它工作。我遇到的問題是我想在我的64位機器上編譯這些文件。我嘗試了幾種編譯這些文件的方式,但都沒有成功。 任何人都可以指向正確的方向嗎?有沒有這樣做的選擇?我試過-m32但這並不奏效。

當我這樣做:

gcc -m32 -o test main.c square.s 

我得到這個:

In file included from /usr/include/stdio.h:28:0, 
      from main.c:1: 
/usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory 
compilation terminated. 
+1

'gcc -m32 -o test main.c square.s'適合我,它怎麼沒有爲你工作? – AusCBloke 2011-12-22 02:48:27

+0

我不確定...讓我再次檢查 – 2011-12-22 02:49:18

+0

OT但我認爲推送和彈出是不必要的 – 2013-08-15 02:24:25

回答

6

編譯/鏈接上的64位32位程序的Ubuntu需要的gcc-multilib的,請嘗試:

sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386 

但是,當您嘗試鏈接其他庫時,可能會遇到其他問題。

使用32-bit chroot environment(即在64位ubuntu上運行32位根目錄)將會有更好的運氣。

+0

謝謝!但是你說的方式對我來說並不合適。相反,我只是做了「sudo apt-get install gcc-multilib」,它工作。 – 2011-12-22 02:58:49

0

看起來好像你的問題一般與32位編譯有關,不管彙編代碼如何。有些東西可能配置錯誤。

此外,您是否考慮使用內聯程序集而不是.s文件? 以這種方式集成C和彙編要容易得多,而且您不必擔心調用約定的細節。