2011-12-22 107 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和汇编要容易得多,而且您不必担心调用约定的细节。