代码之家  ›  专栏  ›  技术社区  ›  rhino

在32位Debian挤压下编译的C程序在我朋友的64位Debian挤压下导致segfult

  •  2
  • rhino  · 技术社区  · 14 年前

    不久前,我已经安装了Debian并在我朋友的帮助下进行了配置。
    昨天我下载了GCC4.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;
    }
    

    我是通过输入来编译的 gcc-4.4 myfile.c 在巴什。然后我试着运行生成的二进制文件,它按我所希望的那样工作。然后我将二进制文件发送给我的朋友在他的电脑上进行测试。当他试图运行它时,他收到一条分段错误消息,程序无法运行。
    2.6.32-5-686 ). 唯一的区别是他的内核是amd-64(他拥有64位处理器,而我的是32位)。
    为什么会这样?这是否意味着64位Linux用户将无法运行我的32位程序?如果是的话,我可以用一种让他们运行它的方式来编译它吗?
    请注意,我并没有真正的Linux经验。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Brandon Frohbieter    14 年前

    他可能需要一只脚。

    apt-get install ia32-libs 
    

    对大多数情况都有效。

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

        2
  •  1
  •   Eric Towers    14 年前

    或者,按照 OSDev wiki
    在/etc/apt/sources.list中设置新的repo

        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 -
    

        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变体。)

    编辑——通过从引用而不是从内存中提取,极大地改进了指令。 编辑—删除过时的镜像

        3
  •  0
  •   codaddict    14 年前

    chroot是一个选项。但请记住,安装32位库时需要大量磁盘空间。

    -m64 编译器标志 gcc 哪一套 int 32 比特和 long pointer 64 为AMD的x86-64体系结构生成代码。