Mostly compiler(gcc or clang) of C and C++, nowadays come with default 64-bit version. Well it would be a good option in terms of speed purposes. But it would lead to problem, if someone wants to run their program as a 32-bit rather than 64-bit for testing or debugging purposes. Therefore we must have a knowledge about this.
Before proceeding forward, let’s confirm which bit-version of gcc is currently installed in our system.
Just type the following command on Linux terminal.
Command: gcc -v
Output
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
......................
......................
Hence the fourth line Target: x86_64-linux-gnu confirms that we are running 64-bit gcc.
Now in order to compile with 32-bit gcc, just add a flag -m32 in the command line of compiling the ‘C’ language program. For instance, to compile a file of geek.c through Linux terminal, you must write the following command with -m32 flag.
Command: gcc -m32 geek.c -o geek
If you get an error as follows:
fatal error: bits/predefs.h: No such file or directory
Then it indicates that a standard library of gcc is been missing. In that case you must install gcc-multlib by using the following command:
For C language:
sudo apt-get install gcc-multilib
For C++ language:
sudo apt-get install g++-multilib
After that you will be able to compile a 32-bit binary on a 64-bit system.
How to check whether a program is compiled with 32-bit after adding a “-m32” flag?
Well we can easily check this by the following program.
C++
#include<iostream>
using namespace std;
int main()
{
cout << "Size = " << sizeof ( size_t );
}
|
C
#include<stdio.h>
int main()
{
printf ( "Size = %lu" , sizeof ( size_t ));
}
|
Compile the above program in Linux by these two different commands,
Default 64-bit compilation,
Input: gcc -m64 geek.c -o out
Output: ./out
Size = 8
Forced 32-bit compilation,
Input: gcc -m32 geek.c -o out
Output: ./out
Size = 4
Can we conclude anything from above program. Yes maybe, let’s try to understand more.
Since the size of data types like long, size_t, pointer data type(int*, char* etc) is compiler dependent, therefore it will generate a different output according to bit of compiler.
This article is contributed by Shubham Bansal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.