There is not much difference between Visual Studio and GCC when it comes to linking object files built from Assembly sources to high-level language code. In fact, to be completely honest, we have to admit that an object file compiled from Assembly code is not different from an object file compiled from high-level languages. In the case of GCC, we have the high-level sources (the C source and the header; no need to modify the files) and two object files, which, for the sake of convenience, we name crypto_32.o and crypto_64.o. The commands used to build executables out of our source and object files would slightly differ depending on the platform in use. If you are running a 32-bit Linux system, then you would issue the following commands in order to build 32-bit and 64-bit executables, respectively:
gcc -o test32 main.c crypto_32.o
gcc -o test64 main.c crypto_64.o -m64
The second command would only work if you have 64-bit development tools/libraries installed.
If you are running a 64-bit system, then you make a slight change to the commands (and take care of the 32-bit development tools and libraries being installed):
gcc -o test32 main.c crypto_32.o -m32
And:
gcc -o test64 main.c crypto_64.o
Inspecting the memory content with GDB while running one of the testxx files would provide you with a picture similar to the following screenshot before encryption:
And after encryption, you will see something like the following: