GNU Fortran-Compiler unter Windows Subsystem für Linux - Segmentierungsfehler bei Übergabe der internen Funktion an eine andere Prozedur [Duplikat]

Nov 29 2020

Ich glaube, das Folgende ist ein gültiges Fortran 2008-Programm und es funktioniert gut unter echten MacOS-, Linux- und Windows-Betriebssystemen mit Intel- und GNU Fortran-Compilern.

module InternalFuncCaller_mod
    implicit none
    abstract interface 
        function getInternalFunc_proc(input) result(output)
            implicit none
            real, intent(in)    :: input
            real                :: output
        end function getInternalFunc_proc
    end interface
contains
    subroutine callInternalFunc(getInternalFunc, x)
        implicit none
        procedure(getInternalFunc_proc) :: getInternalFunc
        real, intent(in)                :: x
        write(*,*) getInternalFunc(x)
    end subroutine callInternalFunc
end module InternalFuncCaller_mod

module InternalFunc_mod
    implicit none
contains
    subroutine passInternalFunc()
        use InternalFuncCaller_mod, only: callInternalFunc
        implicit none
        call callInternalFunc(getThisInternalFunc, x = 4.)
    contains
        function getThisInternalFunc(x) result(sqrtx)
            implicit none
            real, intent(in)    :: x
            real                :: sqrtx
            sqrtx = sqrt(x)
        end function getThisInternalFunc
    end subroutine passInternalFunc
end module InternalFunc_mod

program testInternalFuncCall
    use InternalFunc_mod
    implicit none
    call passInternalFunc()
    write(*,*) "Done."
end program testInternalFuncCall

Wenn es jedoch mit GFortran auf einem Windows-Subsystem für Linux (WSL) (Ubuntu) kompiliert und ausgeführt wird, wird die folgende SegFault-Fehlermeldung angezeigt:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0  0x7ffb84580d3a
#1  0x7ffb8457fed5
#2  0x7ffb843a620f
#3  0x7fffde946cb0
Segmentation fault (core dumped)

Ich habe das Problem auf den internen Funktionsaufruf durch die externe Prozedur zurückgeführt. Der gleiche Code funktioniert jedoch auf allen anderen Betriebssystemen mit unterschiedlichen Fortran-Compilern. Dies scheint also kein Fehler bei GNU GFortran zu sein, sondern eher ein Problem bei der statischen Kompilierung und Ausführung von Code, der externe Aufrufe interner Prozeduren einer anderen Prozedur enthält, insbesondere unter WSL OS.

Um weitere Informationen zu geben, habe ich festgestellt, dass die Bibliothek (auch bei internen Funktionsaufrufen) einwandfrei funktioniert, wenn sie als gemeinsam genutzte Bibliothek erstellt wird. Es schlägt jedoch mit derselben Fehlermeldung fehl, wenn eine statische Bibliothek kompiliert wird.

Es scheint also, dass eine Kombination einiger GFortran-Flags den Fehler irgendwie beheben kann ( -fPIC -shared). Jede Hilfe zur Lösung dieses Problems wird sehr geschätzt.

Antworten

3 Rob Nov 30 2020 at 09:25

Da die Person mit dem Problem im Segmentierungsfehler beim Übergeben der internen Funktion als Argument festgestellt hat, dass die Umstellung auf WSL Version 2 das Problem für mich behebt.