在Linux 64位上组合C和汇编(32位代码)

Hud*_*den 3 c linux 64-bit gcc gnu-assembler

我有一个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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

在我的32位虚拟机上,我使用此命令编译它们

  gcc main.c square.s -o test
Run Code Online (Sandbox Code Playgroud)

它起作用了.我遇到的问题是我想在我的64位机器上编译这些文件.我已经尝试了几种编译这些文件的方法,但没有一种方法可行.谁能指出我正确的方向?有没有选择这样做?我试过-m32但是没有用.

当我这样做:

  gcc -m32 -o test main.c square.s
Run Code Online (Sandbox Code Playgroud)

我明白了:

  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.
Run Code Online (Sandbox Code Playgroud)

J-1*_*DiZ 6

在64位ubuntu上编译/链接32位程序需要gcc-multilib,试试:

sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386
Run Code Online (Sandbox Code Playgroud)

但是,当您尝试链接其他库时,这可能还有其他问题.

使用32位chroot环境(即在64位ubuntu上运行32位root)会更好.