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++ program to demonstrate difference // in output in 32-bit and 64-bit gcc // File name: geek.c #include<iostream> using namespace std;
int main()
{ cout << "Size = " << sizeof ( size_t );
} // This code is contributed by sarajadhav12052009 |
// C program to demonstrate difference // in output in 32-bit and 64-bit gcc // File name: geek.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.