在32位Debian Squeeze下编译的C程序导致我朋友的64位上的段错误

时间:2010-10-23 13:34:00

标签: c linux gcc debian segmentation-fault

不久前,我已经安装了Debian,并在朋友的帮助下配置了它 昨天我已经下载了GCC 4.4,我创建了一个简单的程序来测试它 这是代码:

#include <stdio.h>

int main () {
    int result;
    printf ("Hello Wor... Linux! This is my %dst program compiled in Debian.\nHow many is 2+2?\n", 1);
    scanf ("%d", &result);
    while (result!=4) {
        printf ("Oh no! You're not going anywhere until you type the correct result! 2+2 is?\n");
        scanf ("%d", &result);
    }
    printf ("Congrats!\n");
    return 0;
}

我通过在bash中键入gcc-4.4 myfile.c来编译它。然后我试图运行生成的二进制文件,它就像我想要的那样工作。然后我将二进制文件发送给我的朋友,以便在他的PC上进行测试。当他试图运行它时,他收到了一个分段错误消息,该程序无法正常工作 他还使用Debian,他的内核版本与我的非常相似(2.6.32-5-686)。唯一的区别是他的内核是amd-64(他拥有一个64位处理器,而我的是32位)。 为什么会这样?这是否意味着64位Linux用户将无法运行我的32位程序?如果是这样,我可以用一种让它们运行它的方式编译它吗? 请注意,我对Linux并不熟悉。

3 个答案:

答案 0 :(得分:5)

他可能需要一个chroot。

apt-get install ia32-libs 

适用于大多数情况。

请参阅“使用IA32 chroot运行32位应用程序”http://alioth.debian.org/docman/view.php/30192/21/debian-amd64-howto.html#id292205

答案 1 :(得分:1)

或者,按照OSDev wiki上的说明设置编译器以定位64位二进制文​​件:简而言之:
在/etc/apt/sources.list

中设置新的repos
    deb http://www.tucs.org.au/~jscott4/debian/ stable main    #Primary Mirror. Hosted by University of Tasmania.

添加签名密钥:

    gpg --recv-keys 0x2F90DE4A
    gpg -a --export 0x2F90DE4A | sudo apt-key add -

更新您的repo索引并获取相应的交叉编译包:

    apt-get update
    apt-get install osdev-crosscompiler-x86-64-elf

然后使用gcc的x86_64-elf变体来定位x64。例如

    x86_64-elf-gcc --pedantic -Wall -o foo foo.c

(实际上所有的GCC工具和Binutils现在都有x86_64-elf-变种。)

编辑 - 通过从引用而不是从内存中提取来大大改进指令。 编辑 - 删除陈旧镜像

答案 2 :(得分:0)

chroot是一种选择。但请记住,它需要大量磁盘空间,因为它安装了32位库。

或者,您可以使用-m64编译器标志gccint设置为32位并long来编译64位环境的文件}和pointer64位,并为AMD的x86-64架构生成代码。