Dealing with double _main in the Fortran code
From time to time it happens that you are forced to work with legacy code. This code might have _main already defined inside. This may happen in case you are trying to link two object files, both, defining _main function.
There is hope!
Let’s say we have a code (legacy one)
! legacy.f90 module liblegacy implicit none contains subroutine hello print *,'Hello world!' end subroutine hello end module liblegacy program main use liblegacy implicit none call hello end program main
And now, we are trying to call hello from another main program.
! main.f90 program mycode use liblegacy implicit none print *,'Hello from mycode' call hello end program mycode
If you try to compile it, it will fail
> gfortran-8.3.0 -c legacy.f90 > gfortran-8.3.0 -c main.f90 > gfortran-8.3.0 -o main legacy.o main.o duplicate symbol '_main' in: legacy.o main.o ld: 1 duplicate symbol for architecture x86_64 collect2: error: ld returned 1 exit status
The reason here is, that we have two _main definitions. One in legacy.f90, and another one in main.f90. We can fix that using objcopy. We can weaken _main inside legacy.o.
> gfortran-8.3.0 -c legacy.f90 > objcopy -W _main legacy.o # Force symbol _main to be marked as a weak > gfortran-8.3.0 -c main.f90 > gfortran-8.3.0 -o main legacy.o main.o > ./main Hello from mycode Hello world!
And voilà!