安装了ubuntu16 64位的系统,想在该环境下用gcc编译64位和32位的程序
默认已经安装了64位环境的gcc
1. 首先确认安装的环境是不是64位的
cocoa@cocoaUKlyn:~/Desktop$ dpkg --print-architecture
以下输出表示为64位的
amd64
2. 确认系统是否支持多架构环境
cocoa@cocoaUKlyn:~/Desktop$ dpkg --print-foreign-architectures
以下输出表示支持32位的架构
i386
如果不支持那么手动打开,如下
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get dist-upgrade
3. 安装支持32编译程序的gcc库
sudo apt-get install gcc-multilib g++-multilib
4. 编译一个测试程序 main.c如下
int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("please input one argv\n");
return 0;
}
printf("argc=%d ,argv[1]=%s\n",argc,argv[1]);
return 0;
}
5. 分别编译出64位,32位的可执行程序,main64,main32
cocoa@cocoaUKlyn:~/Desktop$ gcc -o main32 -m32 main.c
cocoa@cocoaUKlyn:~/Desktop$ gcc -o main64 -m64 main.c
6. 使用file命令查看编译的程序架构,
cocoa@cocoaUKlyn:~/Desktop$ file main64
main64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=f8573379cf22e444381d36eec08862e69a90ae4d, not stripped
cocoa@cocoaUKlyn:~/Desktop$ file main32
main32: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=cbff7c2ddf45b505ffd1e60adce482c0cc896475, not stripped
7. 运行编译的64位,32位测试程序
cocoa@cocoaUKlyn:~/Desktop$ ./main64 this64
argc=2 ,argv[1]=this64
cocoa@cocoaUKlyn:~/Desktop$ ./main32 this32
argc=2 ,argv[1]=this32
小插曲:在用读卡器烧写uboot到sd卡时(S5PV210,x210),出现下面错误信息:
BL1 fusing
source file open error
dd: 打开'SD-bl1-8k.bin' 失败: 没有那个文件或目录
rm: 无法删除'SD-bl1-8k.bin': 没有那个文件或目录
原因:sd_fusing.sh里的烧写命令行,烧写对象不对


解决方法,将上面图中圈起来的改为正确目标镜像即可,例如我的是u-boot.bin
如果在烧录成功后,用SD卡启动uboot时,发现并没有成功或者没有所修改(前提自己移植uboot时有修改其某些内容),可能是编译出来的mkbl1是64位程序问题,通过file mkbl1便可以看到其架构,32位和64位的架构显示不一样,上面有例子说明,那么,可以修改sd_fusing.sh所在目录的Makefile中的编译命令,加上-m32选项参数即可编译出32位架构的mkbl1,例如

本文详细介绍了如何在Ubuntu 16 64位系统环境中使用GCC编译器编译64位和32位程序。包括确认系统架构,启用多架构支持,安装多架构编译库,编译测试程序,以及验证编译后的程序架构。

1086

被折叠的 条评论
为什么被折叠?



