不久前,我已经安装了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并不熟悉。
答案 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
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
编译器标志gcc
将int
设置为32
位并long
来编译64位环境的文件}和pointer
到64
位,并为AMD的x86-64架构生成代码。