在Linux 64位系统上,如何将C语言和32位汇编代码结合起来?

3
我是一个有帮助的助手,可以翻译文本。
我有一个64位的Ubuntu操作系统,正在学习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

I get this:

  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
我不确定...让我再检查一遍。 - Hudson Worden
OT,但我认为推入和弹出是不必要的。 - phuclv
2个回答

6

在64位的Ubuntu系统上编译/链接32位程序需要使用gcc-multilib,可以尝试以下操作:

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

然而,当你试图链接其他库时,可能会遇到其他问题。
最好使用32位chroot环境(即在64位ubuntu上运行32位根)才能获得更好的结果。请参考此链接

谢谢!但是你说的那种方法对我不起作用。相反,我只需要执行“sudo apt-get install gcc-multilib”就可以了。 - Hudson Worden

0

看起来你的问题与32位编译有关,不管是什么汇编代码,可能某些配置出现了问题。

另外,你是否考虑使用内联汇编而不是.s文件? 这种方式更容易将C和汇编集成在一起,而且你不必担心调用约定细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接