【问题标题】:Combining C and Assembly(32 bit code) on Linux 64 bit在 Linux 64 位上结合 C 和汇编(32 位代码)
【发布时间】:2011-12-22 02:45:01
【问题描述】:

我有一个 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.

【问题讨论】:

  • gcc -m32 -o test main.c square.s 对我有用,你怎么没用?
  • 我不确定...让我再检查一下
  • OT 但我认为 push 和 pop 是不必要的

标签: c linux gcc 64-bit gnu-assembler


【解决方案1】:

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

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

但是,当您尝试链接其他库时,这可能会出现其他问题。

使用32-bit chroot environment(即在 64 位 ubuntu 上运行 32 位根)会更好。

【讨论】:

  • 谢谢!但是你说的方式对我不起作用。相反,我只是做了“sudo apt-get install gcc-multilib”,它就起作用了。
【解决方案2】:

无论汇编代码如何,您的问题似乎都与一般的 32 位编译有关。可能配置有误。

另外,您是否考虑过使用内联汇编而不是 .s 文件? 以这种方式集成 C 和汇编要容易得多,而且您不必担心调用约定细节。

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2017-10-20
    • 2015-06-20
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多