在32位Debian压缩下编译的C程序在我的朋友';s 64位1
不久前,我在朋友的帮助下安装了Debian并对其进行了配置。在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
昨天我下载了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:显著更新,包括比我的内存提供的信息更好的信息。谢谢你,我明天会尝试,并说它是否有效。如果会的话,我会接受你的回答。现在,我已经投了更高的票。