Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在32位Debian压缩下编译的C程序在我的朋友';s 64位1_C_Linux_Gcc_Debian_Segmentation Fault - Fatal编程技术网

在32位Debian压缩下编译的C程序在我的朋友';s 64位1

在32位Debian压缩下编译的C程序在我的朋友';s 64位1,c,linux,gcc,debian,segmentation-fault,C,Linux,Gcc,Debian,Segmentation Fault,不久前,我在朋友的帮助下安装了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", &re

不久前,我在朋友的帮助下安装了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;
}
#包括
int main(){
int结果;
printf(“你好……Linux!这是我用Debian编译的%dst程序。\n 2+2有多少?\n”,1);
scanf(“%d”,和结果);
while(结果!=4){
printf(“哦,不!在键入正确的结果之前,您哪儿都不能去!2+2是?\n”);
scanf(“%d”,和结果);
}
printf(“恭喜!\n”);
返回0;
}
我通过在bash中键入
gcc-4.4myfile.c
来编译它。然后我试着运行生成的二进制文件,它按照我希望的那样工作。然后我把二进制文件发送给我的朋友,在他的电脑上测试。当他试图运行它时,他收到一条分段错误消息,程序无法运行。
他还使用Debian,他的内核版本与我的非常相似(
2.6.32-5-686
)。唯一的区别是他的内核是amd-64(他拥有一个64位处理器,而我的是32位处理器)。
为什么会这样?这是否意味着64位Linux用户将无法运行我的32位程序?如果是这样的话,我可以用一种能让他们运行它的方式来编译它吗?

请注意,我对Linux不是很有经验。

他可能需要一个chroot

apt-get install ia32-libs 
应该适用于大多数情况


请参阅“使用IA32 chroot运行32位应用程序”

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


或者,您可以使用
gcc
-m64
编译器标志为64位环境编译文件,该标志将
int
设置为
32
位和
long
位和
指针
设置为
64
位,并为AMD的x86-64体系结构生成代码。

或者,按照:简言之:
在/etc/apt/sources.list中设置新的回购协议

deb http://www.tucs.org.au/~jscott4/debian/ stable main #Primary Mirror. Hosted by University of Tasmania. 黛布http://www.tucs.org.au/~jscott4/debian/stable main#主镜像。塔斯马尼亚大学主办。 添加签名密钥:

gpg --recv-keys 0x2F90DE4A gpg -a --export 0x2F90DE4A | sudo apt-key add - gpg—接收键0x2F90DE4A gpg-a—导出0x2F90DE4A | sudo apt密钥添加- 更新回购指数并获得适当的交叉编译包:

apt-get update apt-get install osdev-crosscompiler-x86-64-elf 更新源 apt get安装osdev-crosscompiler-x86-64-elf 然后使用gcc的x86_64-elf变体以x64为目标。比如说

x86_64-elf-gcc --pedantic -Wall -o foo foo.c x86_64-elf-gcc——学究式的——墙——o foo foo.c (事实上,现在所有的GCC工具和Binutil都将有一个x86_64-elf变体。)

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

感谢您的有用回答。我现在无法尝试你的解决方案,但我相信它会奏效(在阅读网页后似乎是这样),这就是为什么我接受了你的答案。由于包裹大小出现在下面。。。安装的ia32 libs包大小约为73 MB。这对我不起作用。我通过键入
gcc-4.4-m64 myfile.c
进行了尝试,我收到了以下错误:
在/usr/include/features.h:378、/usr/include/stdio.h:28、myfile.c:1:/usr/include/gnu/stubs.h:9:27:错误:gnu/stubs-64.h:没有这样的文件或目录
谢谢你的回答,我很快就要测试它了。顺便问一下,你能解释一下
-fPIC
的作用吗?编辑:我忘了一件重要的事。多库版本大吗?嗯,我的Debian在pendrive上,所以…apt get可能需要10 MB多一点的安装空间。通常情况下,您会得到一个关于它首先需要多少空间的提示。fPIC是最近的习惯。删掉了。对不起,这不适合我。我已经完全按照你说的做了尝试,但是生成的二进制文件仍然会在我朋友的电脑上生成一个segfault。@rhino:显著更新,包括比我的内存提供的信息更好的信息。谢谢你,我明天会尝试,并说它是否有效。如果会的话,我会接受你的回答。现在,我已经投了更高的票。