我有一个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
我明白了:
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.
答案 0 :(得分:6)
在64位ubuntu上编译/链接32位程序需要gcc-multilib,试试:
sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386
但是,当您尝试链接其他库时,这可能会有其他问题。
使用32-bit chroot environment(即在64位ubuntu上运行32位root)会更好。
答案 1 :(得分:0)
看起来您的问题通常与32位编译有关,无论汇编代码如何。有些东西可能是错误的配置。
另外,您是否考虑使用内联汇编而不是.s文件? 以这种方式集成C和汇编要容易得多,而且您不必担心调用约定细节。